Operaciones con archivos y directorios

LinuxBeginner
Practicar Ahora

Introducción

Linux organiza los archivos en un único árbol de directorios que comienza en /, el directorio raíz. Cada archivo y directorio tiene una ruta que describe su ubicación dentro de ese árbol. Aprender a leer y utilizar rutas facilita prácticamente cualquier tarea posterior en Linux.

En este laboratorio, creará un pequeño espacio de trabajo mientras aprende las operaciones habituales del trabajo diario en el terminal. Navegará por directorios, creará y editará archivos, copiará y moverá datos, buscará archivos, inspeccionará metadatos e inodes, experimentará con enlaces físicos y simbólicos, y comparará archivos y árboles de directorios con diff.

Explore el árbol de directorios de Linux

En este paso, identificará su ubicación actual, inspeccionará directorios importantes del nivel superior y creará un espacio de trabajo específico para el resto del laboratorio.

El comando pwd significa «print working directory» (mostrar el directorio de trabajo). Ejecútelo primero para saber dónde se inició el terminal:

pwd

El resultado debería ser /home/labex/project. Una ruta absoluta comienza con / y describe una ubicación desde la raíz del sistema de archivos.

Muestre el nivel superior del sistema de archivos:

ls /

Verá directorios estándar como etc, home, tmp, usr y var. Sus usos habituales son:

  • /etc almacena la configuración de todo el sistema.
  • /home almacena los directorios personales de los usuarios comunes.
  • /tmp almacena datos temporales.
  • /usr contiene muchos programas instalados y recursos compartidos.
  • /var contiene datos que cambian con frecuencia, como registros y cachés.

La opción -d indica a ls que describa los directorios especificados en lugar de mostrar su contenido. La opción -l selecciona el formato largo:

ls -ld /etc /home /tmp /usr /var

El primer carácter de cada línea es d, lo que indica que el objeto es un directorio. Las columnas restantes contienen los permisos, el propietario, el tamaño, la fecha y hora, y el nombre.

Cree un espacio de trabajo para este laboratorio. La opción -p permite que mkdir cree los directorios padre que falten y evita un error si el directorio ya existe:

mkdir -p /home/labex/project/file-ops-lab

Entre en él y confirme su nueva ubicación:

cd /home/labex/project/file-ops-lab
pwd

El resultado final debería ser /home/labex/project/file-ops-lab.

En este paso, creará un árbol de directorios anidados y se moverá por él utilizando rutas absolutas, rutas relativas y atajos de navegación.

Asegúrese de comenzar en el espacio de trabajo del laboratorio:

cd /home/labex/project/file-ops-lab

Cree tres directorios anidados con un solo comando:

mkdir -p navigation/alpha/beta

Aquí, navigation/alpha/beta es una ruta relativa porque no comienza con /. El intérprete de comandos la resuelve a partir del directorio actual.

Utilice una ruta absoluta para entrar en el directorio más profundo:

cd /home/labex/project/file-ops-lab/navigation/alpha/beta
pwd

La ruta especial .. representa el directorio padre. Vaya de beta a alpha:

cd ..
pwd

El resultado debería terminar en /navigation/alpha. El comando cd - vuelve al directorio de trabajo anterior:

cd -
pwd

Debería estar de nuevo en beta. Por último, ~ representa su directorio personal. Úselo al principio de una ruta para volver al espacio de trabajo del laboratorio:

cd ~/project/file-ops-lab
pwd

Las rutas absolutas funcionan desde cualquier ubicación. Las rutas relativas son más cortas cuando ya conoce su ubicación actual.

Cree directorios y escriba archivos

En este paso, creará directorios y archivos. Después aprenderá la diferencia entre sobrescribir y añadir contenido mediante la redirección del shell.

Comience en el espacio de trabajo del laboratorio y cree dos directorios a la vez:

cd /home/labex/project/file-ops-lab
mkdir documents archive

El comando touch crea un archivo vacío cuando el archivo especificado no existe:

touch documents/empty.txt

Inspeccione el archivo vacío con el formato de listado largo:

ls -l documents/empty.txt

Su tamaño debería ser de 0 bytes. A continuación, > redirige la salida de un comando a un archivo. Crea el archivo o reemplaza su contenido anterior:

echo "Linux file practice" > documents/notes.txt

El operador >> añade la salida sin eliminar el contenido existente:

echo "Paths identify each filesystem object" >> documents/notes.txt

Muestre el archivo completo con cat:

cat documents/notes.txt

Debería ver dos líneas en su orden original. Utilice wc -l para contarlas; -l indica a wc que cuente líneas:

wc -l documents/notes.txt

El primer campo debería ser 2.

Copie, mueva, cambie el nombre y elimine archivos

En este paso, practicará las cuatro formas habituales en que cambian los objetos del sistema de archivos: copiar, mover, cambiar el nombre y eliminar.

Vuelva al espacio de trabajo del laboratorio:

cd /home/labex/project/file-ops-lab

El comando cp copia un origen en un destino. Copie notes.txt en el archivo con un nombre nuevo:

cp documents/notes.txt archive/notes-backup.txt

Confirme que tanto el archivo original como la copia existen:

ls -l documents/notes.txt archive/notes-backup.txt

Cree un archivo temporal y utilice mv para moverlo y cambiarle el nombre en una sola operación:

echo "draft" > documents/draft.txt
mv documents/draft.txt archive/final-draft.txt

La ruta antigua ya no debería existir, mientras que la nueva sí:

ls -l archive/final-draft.txt

Para copiar un directorio y todo su contenido, utilice la opción recursiva -r:

cp -r documents archive/documents-copy
find archive/documents-copy -maxdepth 1 -type f

El comando rm elimina archivos permanentemente; el terminal no tiene una papelera de reciclaje. Cree y elimine un archivo desechable:

touch disposable.tmp
rm disposable.tmp

Muestre el directorio actual para confirmar que la ruta ha desaparecido:

ls

disposable.tmp no debería aparecer. Compruebe siempre cuidadosamente una ruta antes de utilizar rm.

Vea, actualice y busque archivos

En este paso, creará un archivo con varias líneas, inspeccionará distintas partes, lo actualizará mediante una redirección de adición y lo buscará por nombre.

Vuelva al espacio de trabajo del laboratorio. Un documento aquí-document envía varias líneas a un comando hasta que el shell llega a una línea que contiene únicamente el marcador elegido, en este caso EOF:

cd /home/labex/project/file-ops-lab
cat > documents/journal.txt <<'EOF'
First entry: created a workspace
Second entry: practiced paths
Third entry: copied files
EOF

Las comillas de 'EOF' impiden que el shell expanda los caracteres especiales dentro del documento. Muestre el archivo con números de línea:

nl -ba documents/journal.txt

La opción -ba numera todas las líneas. Utilice head -n 2 para mostrar las dos primeras líneas y tail -n 1 para mostrar la última:

head -n 2 documents/journal.txt
tail -n 1 documents/journal.txt

Añada una cuarta entrada. Antes utilizó >>; este operador agrega la salida al final sin reemplazar las tres líneas existentes:

echo "Fourth entry: reviewed the results" >> documents/journal.txt

Compruebe el resultado:

tail -n 2 documents/journal.txt

Ahora busque archivos de texto en el espacio de trabajo. En find, . representa el directorio actual, -type f limita los resultados a archivos normales y -name busca un patrón de nombre de archivo. Las comillas impiden que el shell expanda *.txt antes de que find lo reciba:

find . -type f -name "*.txt"

La salida debería incluir ./documents/journal.txt junto con los demás archivos de texto que creó.

Inspeccione tipos de archivo, metadatos e inodes

En este paso, irá más allá del nombre de un archivo e inspeccionará la información que Linux almacena sobre un objeto del sistema de archivos.

Comience en el espacio de trabajo del laboratorio y pida a file que identifique dos objetos diferentes:

cd /home/labex/project/file-ops-lab
file documents/journal.txt /bin/ls

El diario se identifica como texto, mientras que /bin/ls se identifica como un programa ejecutable. Linux no se basa únicamente en las extensiones de los nombres para identificar los datos.

El comando stat muestra metadatos como el tamaño, los permisos, el propietario, las marcas de tiempo y el número de inode:

stat documents/journal.txt

Un inode es el registro del sistema de archivos que almacena los metadatos de un archivo y apunta a sus datos. Un nombre de archivo es una entrada de directorio que hace referencia a un inode. Utilice un formato personalizado de stat para mostrar campos estables:

stat -c 'name=%n type=%F size=%s inode=%i links=%h' documents/journal.txt

El campo %i es el número de inode, mientras que %h es el número de enlaces físicos que hacen referencia a ese inode.

La opción -i de ls también muestra los números de inode. Cree un archivo para practicar con metadatos e inspecciónelo:

echo "inode practice" > metadata-sample.txt
ls -li metadata-sample.txt

El número al principio de la línea es el número de inode. Puede variar entre entornos, así que concéntrese en lo que representa el campo en lugar de memorizar su valor.

Trabaje con enlaces físicos y enlaces simbólicos

En este paso, creará ambos tipos de enlaces de Linux y observará cómo se comporta cada uno cuando se elimina el nombre de archivo original.

Cree un directorio y un archivo de origen para el experimento:

cd /home/labex/project/file-ops-lab
mkdir links
echo "shared inode data" > links/source.txt

El comando ln sin opciones crea un enlace físico. Ambos nombres hacen referencia al mismo inode y a los mismos datos del archivo:

ln links/source.txt links/hard-link.txt

La opción -s crea un enlace simbólico, también llamado symlink. Un enlace simbólico almacena la ruta hacia otro archivo:

ln -s source.txt links/symbolic-link.txt

Compare los números de inode y la información de los enlaces:

ls -li links

source.txt y hard-link.txt deberían tener el mismo número de inode. El enlace simbólico tiene su propio inode y muestra -> source.txt.

Utilice readlink para mostrar la ruta almacenada dentro del enlace simbólico:

readlink links/symbolic-link.txt

Elimine el nombre de archivo original:

rm links/source.txt

El enlace físico todavía permite acceder al inode y a sus datos:

cat links/hard-link.txt

Ahora el enlace simbólico apunta a un nombre que ya no existe. Intente leerlo:

cat links/symbolic-link.txt

Se espera el error No such file or directory, que proporciona una evidencia útil: el objeto del enlace permanece, pero la ruta de destino almacenada está rota. Este experimento muestra por qué eliminar un nombre de enlace físico no elimina los datos mientras exista otro enlace físico, mientras que un enlace simbólico depende de la ruta de destino que almacena.

Compare archivos y directorios con Diff

En este paso, utilizará diff para localizar diferencias y, después, sincronizará dos árboles de directorios pequeños.

Cree dos directorios de versiones:

cd /home/labex/project/file-ops-lab
mkdir -p comparison/version-a comparison/version-b

Cree archivos de configuración que difieran en una línea:

printf 'mode=production\nport=8080\n' > comparison/version-a/app.conf
printf 'mode=production\nport=9090\n' > comparison/version-b/app.conf

La opción -u solicita a diff una vista unificada con contexto alrededor de cada cambio:

diff -u comparison/version-a/app.conf comparison/version-b/app.conf

diff marca con - las líneas del primer archivo y con + las líneas del segundo. Su estado de salida distinto de cero significa que los archivos son diferentes; esto es lo esperado.

Haga que el segundo archivo coincida con el primero y utilice después -q para realizar una comprobación silenciosa de igualdad:

cp comparison/version-a/app.conf comparison/version-b/app.conf
diff -q comparison/version-a/app.conf comparison/version-b/app.conf

La ausencia de salida significa que los archivos coinciden. Ahora añada un archivo únicamente a uno de los directorios:

echo "release notes" > comparison/version-a/README.txt

La opción -r compara recursivamente los árboles de directorios:

diff -r comparison/version-a comparison/version-b

La salida informa de que README.txt solo existe en version-a. Cópielo y vuelva a comparar:

cp comparison/version-a/README.txt comparison/version-b/README.txt
diff -r comparison/version-a comparison/version-b

El comando final no debería producir ninguna salida. Esto demuestra que ambos árboles de directorios contienen ahora el mismo contenido de archivos.

Resumen

Ha practicado las operaciones básicas con archivos y directorios que se utilizan en el trabajo con el terminal de Linux. Ha navegado mediante rutas absolutas y relativas, ha creado y editado archivos, ha copiado y movido datos, ha eliminado de forma segura un archivo desechable y ha buscado archivos por nombre.

También ha inspeccionado tipos de archivo y metadatos, ha aprendido cómo se relacionan los nombres de archivo con los inodes, ha comparado enlaces físicos con enlaces simbólicos y ha utilizado diff para comparar archivos individuales y árboles de directorios completos. Estos conceptos le preparan para razonar sobre los archivos de Linux en lugar de tratar los comandos como recetas aisladas.