Curso de Bash desde cero / Capítulo 3
Gestión de archivos
Sistema de archivos Unix
Los sistemas de archivos Unix están organizados por un único árbol jerárquico que empieza por /, llamado raíz.
Directorios por defecto más típicos
/ Raíz del sistema.
/home Directorios personales de los usuarios.
/etc Archivos de configuración del sistema.
/bin Programas básicos.
/usr Programas del usuario.
/var Datos variables del sistema (registros, logs, colas…).
/tmp Archivos temporales.
Puedes explorar un directorio sin encontrarte en él haciendo referencia a su ruta absoluta o relativa.
Manipulación
Creación de un archivo
- touch nombre_archivo Crea un nuevo archivo en el directorio actual.
Creación de un directorio
mkdir nombre_carpeta Crea un nuevo directorio en el directorio actual.
mkdir dir/nombre_carpeta Crea un nuevo directorio en el directorio seleccionado.
Eliminación de un directorio vacío
- rmdir nombre_carpeta Elimina un directorio vacío (solo funciona si la carpeta está vacía).
Copia de un archivo o directorio
cp nombre_archivo copia_archivo Copia un archivo a otro en el directorio (como siempre, puede definirse otro directorio de destino).
cp -r nombre_carpeta nombre_carpeta_copia Copia recursiva de todos los archivos y subdirectorios (no preserva atributos especiales como permisos, propietarios, marcas de tiempo o enlaces simbólicos). Se usa cuando solo quieres el contenido, no una copia exacta.
cp -a nombre_carpeta nombre_carpeta_copia Copia recursiva exacta.
Movimiento o renombramiento de un archivo o directorio
mv nombre_archivo dir Mueve un archivo a un directorio.
mv nombre_carpeta dir Mueve un directorio a otro.
mv nombre_carpeta_o_archivo nuevo_nombre Renombra el directorio o archivo.
Eliminación de archivos o directorios
rm nombre_archivo Elimina un archivo.
rm -r nombre_carpeta Elimina un directorio y todo su contenido de manera recursiva.
rm -ri nombre_carpeta Modo de eliminación recursiva con confirmación interactiva.
Precaución
El comando
rmno envía nada a la papelera. Lo que borras, borrado queda. Cuidado con lo que escribes.La opción
-f(force) derm -rfes especialmente peligrosa: no pide confirmación y ni siquiera avisa si el directorio no existía. Antes de lanzar unrmcon comodines, prueba el mismo patrón conlspara ver exactamente qué vas a borrar.
Comodines
Los comodines permiten actuar sobre muchos archivos a la
vez sin escribirlos uno a uno. Funcionan con cualquier comando,
no solo con ls.
| Comodín | Significa |
|---|---|
* |
Cero o más caracteres cualesquiera |
? |
Exactamente un carácter |
[abc] |
Un carácter que sea a, b o
c |
[0-9] |
Un carácter que sea un dígito |
[!a] |
Un carácter que no sea a |
Ejemplos:
ls *.md # todos los .md
ls 03* # los que empiezan por 03
ls 03*.txt # empiezan por 03 y acaban en .txt
ls ?????* # los que tienen 5 caracteres o más
ls informe[0-9].txt # informe1.txt, informe2.txt... pero no informe10.txt
rm ?.txt # los de un solo carácter de nombre: a.txt, 1.txtPrecaución
Antes de un
rmcon comodines, lanza el mismo patrón conls. Es un segundo de trabajo y te enseña exactamente qué vas a borrar:ls a???? # primero miro rm a???? # y si es lo que quiero, ahora sí
Expansión de llaves
Las llaves no son un comodín: no buscan archivos existentes, sino que generan texto. Son comodísimas para crear cosas:
touch nota{1..5}.txt # crea nota1.txt ... nota5.txt
mkdir -p proyecto/{src,doc,test} # crea las tres carpetas de golpe
cp notas.txt notas.txt.bak # lo de siempre...
cp notas.txt{,.bak} # ...abreviadoBuscar archivos
tree muestra la estructura en forma de árbol:
tree # el árbol desde aquí
tree -a # incluyendo los ocultos
tree -L 2 # solo dos niveles de profundidadfind busca archivos por lo que le digas. Es más potente
de lo que parece:
find . -name "notas.txt" # por nombre exacto, desde aquí
find . -iname "*.LOG" # sin distinguir mayúsculas
find . -type d # solo directorios
find . -type f -name "*.sh" # solo archivos, y que acaben en .sh
find . -size +10M # los que ocupan más de 10 MB
find . -mtime -7 # modificados en los últimos 7 díasY puede ejecutar algo sobre lo que encuentra:
find . -name "*.tmp" -delete # borrarlos
find . -name "*.sh" -exec chmod +x {} \; # darles permiso de ejecuciónEn -exec, las llaves {} son «cada archivo
encontrado», y el \; marca dónde acaba el comando.
Precaución
findcon-deleteo-exec rmborra sin preguntar. Ejecuta siempre primero la búsqueda a secas para ver la lista, y solo después añade la acción.
Comprimir y descomprimir
Un archivo comprimido junta muchos archivos en uno y ocupa menos. En
Linux lo habitual es tar:
# Comprimir una carpeta
tar -czf copia.tar.gz mi_carpeta
# Ver qué hay dentro sin extraer nada
tar -tzf copia.tar.gz
# Extraer
tar -xzf copia.tar.gzLas letras de tar se entienden mejor sabiendo qué
significan:
| Letra | Significa |
|---|---|
c |
create: crear un archivo nuevo |
x |
extract: extraer |
t |
list: ver el contenido |
z |
comprimir con gzip (el .gz del nombre) |
f |
el siguiente argumento es el nombre del archivo |
También existe zip, más habitual si vas a compartir con
alguien que use Windows:
zip -r copia.zip mi_carpeta
unzip copia.zipEnlaces simbólicos
Un enlace simbólico es un acceso directo: un archivo que apunta a otro sitio.
ln -s /ruta/muy/larga/al/archivo.txt atajo.txtAl listarlo con ls -l se reconoce por la l
del principio y la flecha:
lrwxrwxrwx 1 nica nica 9 Jul 30 15:10 atajo.txt -> archivo.txtSi borras el enlace no borras el original. Pero si borras el original, el enlace se queda apuntando al vacío (enlace roto).
Ejercicios
Crea un directorio.
Elimina el directorio que acabas de crear.
Copia un archivo en el directorio actual y fuera de Este.
Mueve un archivo del directorio actual.
Cambia el nombre del archivo que acabas de mover.
Lista todos los archivos de un tipo usando un comodín.
Elimina un directorio de manera recursiva (cuidado con lo que vas a borrar).
Elimina todos los archivos de un mismo tipo (cuidado con lo que vas a borrar).
Utiliza el comando tree.
Busca un archivo concreto en el directorio actual utilizando find.