Manipular ficheros y carpetas

Para trabajar desde una terminal, es muy necesario saber moverse entre carpetas y manipular ficheros y carpetas. Acciones como copiar, mover y borrar ficheros o crear carpetas forman parte del día a día en nuestras terminales de texto.

Por esa razón es necesario conocer algunos de los comandos más habituales para estas y otras tareas relacionadas, así como sus parámetros o curiosidades más importantes.

Identificar ficheros (file)

Existe un comando no demasiado conocido llamado file con el cuál puedes saber con que tipo de fichero estás trabajando. En principio, normalmente identificamos a los ficheros por sus extensiones, si es .txt es un fichero de texto y si es .mp3 se trata de un archivo de audio. Sin embargo, estas extensiones son una convención. Nada me impide renombrar un fichero .txt como .mp3. Simplemente, no funcionará si lo abro con un reproductor de audio.

$ file /etc/hosts
/etc/hosts: ASCII text

$ file music.s3m
/home/manz/music.s3m: ScreamTracker III Module sound data

Sin embargo, file no se guiará por la extensión, sino que analizará su contenido, más concretamente su número mágico, para intentar reconocer que tipo de archivo es.

Nota: Si file no es lo suficientemente exhaustivo para ti, existe un proyecto llamado trID que tiene la misma filosofía que file pero analiza los ficheros en mayor profundidad.

Copiar ficheros (cp)

Una operación básica a la hora de usar una terminal es la de copiar ficheros. Nos encontramos continuamente haciendo copias de ficheros o carpetas, ya sea de una ruta a otra o sobre la misma carpeta donde nos encontramos. Para ello, utilizamos el comando cp (copy), que suele utilizarse de la siguiente forma:

$ pwd
/home/manz

$ cp origen.txt /home/tux/destino.txt

En este sencillo ejemplo hemos copiado el fichero origen.txt desde la carpeta /home/manz a la carpeta /home/tux cambiándole el nombre a destino.txt.

Asumamos que seguimos en la carpeta /home/manz:

Rutas relativas y rutas absolutas

La forma en la que especificamos las rutas y copiamos ficheros, pueden simplificarse y hacerse más flexibles dependiendo de si utilizamos rutas absolutas o rutas relativas:

Tipo Descripción
Ruta absoluta Ruta completa de la carpeta o fichero desde el raíz. Ej: /home/tux
Ruta actual Ruta donde nos encontramos actualmente. Ej: .
Ruta padre Ruta a la carpeta anterior de donde nos encontramos actualmente. Ej: ..
Ruta relativa Ruta completa, pero sólo a partir de la carpeta donde nos encontramos. Ej: ../tux

Veámoslo con varios ejemplos:

# Caso 1: Rutas absolutas
$ cp /home/manz/origen.txt /home/tux/destino.txt

# Caso 2: Rutas relativas
$ cp origen.txt destino.txt

# Caso 3: Rutas relativas
$ cp origen.txt ../tux/destino.txt

# Caso 4: Ruta absoluta y ruta relativa
$ cp /etc/resolv.conf ./backup.conf
  • El primer caso, equivalente al primer ejemplo, pero indicando rutas absolutas.
  • El segundo caso, creamos una copia con nombre destino.txt en la misma ruta.
  • El tercer caso, asumiendo que seguimos en la ruta /home/manz, copiamos el fichero origen.txt a la ruta relativa ../tux, es decir, a /home/tux, con nombre destino.txt.
  • El cuarto caso, copiamos el fichero resolv.conf de la ruta /etc a ., o sea, la carpeta actual donde nos encontramos, pero con el nombre backup.conf.

Por otro lado, es importante recalcar que el comando cp tiene algunos parámetros que pueden resultarnos útiles, como por ejemplo el parámetro -r que nos permite hacer copias recursivas, esto es, no sólo copiar ficheros, sino carpetas y su contenido, ya que por defecto cp solo copia ficheros.

Los parámetros más populares son los siguientes:

Parámetro Significado
-r (recursive) El comando cp sólo copia ficheros. Usar -r si se quiere copiar carpetas y su contenido.
-u (update) Copia sólo cuando no hay fichero de destino. Si existe, sólo cuando el origen es más nuevo.
-n (no clobber) No sobreescribe en el destino un fichero que ya existe.
-v (verbose) Por defecto, cp trabaja en silencio. Con este parámetro muestra lo que está haciendo.

Mover o renombrar ficheros (mv)

Al igual que hemos utilizado cp para copiar ficheros, podríamos utilizar mv (move) para mover archivos. La diferencia entre estos dos comandos es que, mv en lugar de mantener el fichero original como hace cp, lo elimina tras la copia:

# Caso 1: Mueve un fichero
$ mv /home/tux/info.txt /home/manz/

# Caso 2: Mueve y renombra un fichero
$ mv /home/tux/info.txt /home/manz/tuxdata.txt

# Caso 3: Renombra un fichero
$ mv info.txt tuxdata.txt

Obsérvese que en el primer caso, se está moviendo un fichero a una ruta concreta, pero podemos utilizar mv para renombrar a la vez que movemos (como en el caso 2) o simplemente renombrar sin mover de ruta (caso 3).

De la misma forma que cp, el comando mv tiene los mismos parámetros que mencionamos.

Borrar ficheros (rm)

Probablemente, otro de los comandos más utilizados en la terminal es rm (remove), que sirve para eliminar ficheros o carpetas de nuestro sistema. Hay que tener mucho cuidado con él, ya que una vez un fichero es eliminado, aunque no es imposible, es complicado recuperarlo.

Parámetro Significado
-f (force) Fuerza a hacer el borrado, sin preguntar.
-r (recursive) Elimina recursivamente carpetas y su contenido.
-d (dir) Elimina carpetas vacías.
-v (verbose) Por defecto, rm trabaja en silencio. Con este parámetro muestra lo que está haciendo.

Como mencionamos anteriormente, el comando rm realmente no borra un fichero, sino que lo «marca» en el disco como reutilizable. Si la zona del disco donde residía es sobreescrita con otro fichero, probablemente sea imposible recuperarlo, pero en caso contrario hay cierta posibilidad.

Nota: Si deseas eliminar por completo un fichero, sin posibilidad de recuperación, es mejor utilizar el comando shred -u seguido del nombre del fichero a eliminar. Este comando sobreescribe con información aleatoria el fichero, y luego lo elimina (parámetro -u).

Mejora del rm (rip)

Si la filosofía por defecto del comando rm no te agrada, o eres una persona que suele eliminar ficheros por accidente, quizás te interese el comando rip (rm improved).

Se trata de una alternativa a rm desarrollada en Rust, que establece que al eliminar un archivo con rip, pasa a estar «muerto» en una zona del disco denominada «cementerio» (por defecto, /tmp/graveyard-user, donde user es el nombre de usuario), que hace las veces de papelera de reciclaje tétrica.

Si hemos borrado accidentalmente el fichero, podemos «resucitarlo» escribiendo rip -u (undelete) o simplemente acceder a los ficheros dentro de la estructura del cementerio. Si queremos vaciar el cementerio, basta con escribir rip -d (decompose) o eliminar la estructura de carpetas manualmente.

Otra alternativa similar a rm podría ser trash-cli.

Crear carpetas o ficheros vacíos

Mediante el comando mkdir, seguido de un nombre de carpeta, podemos crear nuevas carpetas vacías.

Si queremos crear una estructura de varias carpetas una dentro de otra, en vez de hacerlo una por una. El siguiente comando crea una carpeta parent, que dentro tiene una carpeta child y dentro de ella, una carpeta grandchild:

$ mkdir -p parent/child/grandchild

Por otro lado, el comando touch sería la versión de mkdir orientada a ficheros en lugar de carpetas. Si necesitamos crear un archivo vacío, por ejemplo, para editar más tarde, podemos hacerlo rápidamente con touch:

touch file.txt

El comando anterior crearía un fichero vacío con nombre file.txt. Si ya existiera el archivo, simplemente actualiza su fecha de modificación.

Crear enlaces (ln)

El comando ln (link names) permite crear enlaces entre ficheros, una especie de referencias o accesos directos a ficheros, rutas o carpetas. Existen dos tipos de enlaces:

  • Los enlaces duros. Son los ficheros que apuntan a otro fichero basándose en su número interno (inodo). Se crean utilizando el comando ln. De esta forma podemos tener varios archivos con el mismo contenido, pero sus copias no duplican el contenido del fichero original, sino que son una referencia al primero. Son poco utilizados.

  • Los enlaces simbólicos (también considerados enlaces blandos). Son un tipo de referencia a otros ficheros, pero esta vez basándose en su ubicación. Se crean utilizando el comando y parámetro ln -s. De esta forma, cuando accedemos a un enlace simbólico, realmente estamos accediendo al fichero que apunta. Si creamos un enlace simbólico y borramos su archivo original, el enlace aparecerá en rojo y se considerará un enlace simbólico roto.

Veamos un ejemplo:

$ ln -s original.txt link

$ ls -lh

total 0
lrwxrwxrwx 1 manz manz 12 jul  1 19:37 link -> original.txt
-rw-r--r-- 1 manz manz  0 jul  1 19:37 original.txt

Como se puede ver, con el comando ln creamos un enlace, y con el parámetro -s indicamos que queremos que sea simbólico. El primer fichero indicado sería el archivo original al que queremos apuntar, mientras que el segundo fichero indicado sería el enlace simbólico que queremos crear.

Al hacer un ls, observaremos que nos indica a donde apunta el enlace simbólico (puede ser un fichero, una carpeta, etc...). En el caso de que el enlace se encuentre correcto, aparecerá en azul cyan, pero si el fichero original a donde apunta no existiera, aparecería en rojo.

Estos enlaces pueden ser realmente útiles cuando necesitamos que en la carpeta actual exista el contenido de otra carpeta, pero no queramos duplicar la información (son carpetas con mucho espacio ocupado) o queremos mantenerlo actualizado y simplemente queremos una referencia de una carpeta a otra.

Manz
Publicado por Manz

Docente, divulgador informático y freelance. Autor de Emezeta.com, es profesor en la Universidad de La Laguna y dirige el curso de Programación web FullStack y Diseño web FrontEnd de EOI en Tenerife (Canarias). En sus ratos libres, busca GIF de gatos en Internet.