enchufado
   RSS
#
Ficheros imborrables (GNU/Linux) 2006-06-25 14:24:40

Estas cosas pasan muy poco a menudo. Tanto, que si no has cacharreado un buen rato con shells, muy posiblemente no hayas tenido la ocasión de conocerlas.

Resulta que la sintaxis, cantidad, orden... de los parámetros y opciones de algunas aplicaciones de línea de comandos no siempre está muy clara, y es necesario hacer algunas pruebas antes de dar con el modo de trabajar con ciertas aplicaciones. Ello puede llegar a ocasionar que se creen, por accidente, archivos con nombres variopintos que luego necesitaran de caracteres de escape shell para que el mismo intérprete de comandos o las aplicaciones para gestionar esos ficheros (rm, cp, mv...) no se vuelvan tontos.

Ya se que esto no es algo fortuito, pero a modo de ejemplo pongamos:

touch \\-p

Esto nos creará el archivo con nombre \-p. Genial, y ahora... ¿cómo lo borramos? Si tenemos un desktop con X y gestor de ficheros, sencillo. Incluso si recurrimos al bienaventurado midnight commander saldremos airosos. Pero hay otras maneras de hacerlo usando la misma shell. En este caso nos bastaría un:

rm "\-p"

Pero, ¿y si tenemos un archivo llamado --hola? Lo podemos crear con:

tar cvf --hola algun_archivo

ó

touch -- -hola

Puede que veáis cosas raras y pensaréis que ahí ya la hemos jodío. Pues magia potagia, rm nos salva del aprieto indicándole con -- que a partir de ahí hemos terminado con la lista de opciones:

rm -- --hola

Nótese que el argumento -- puede ser usado en la mayoría de comandos para indicar lo mismo: que a partir de ese punto ya se ha terminado el paso de parámetros de ejecución a la aplicación, y en todo caso, lo que se le pasa son ficheros. Para entendernos, todo lo que son parámetros (p.ej. ls -l) van antes del --, y lo demás después (p.ej. ls -l -- readme*).

En última instancia y como he podido encontrar en una web, también podemos borrar un archivo por su inodo (ahora sí que matamos moscas a cañonazos). En este caso, ¡asegúrate antes de que no tienes enlaces duros que quieras conservar! Los enlaces blandos tienen otro número de inodo, así que no serán borrados en esta operación. La operación se resume a lo siguiente (creo que es autoexplicativa):

first64:~# touch -- -piripi
first64:~# ln -- -piripi --piripi2
first64:~# ln -s -- -piripi -piripi3
first64:~# ls -li -- *piripi*
32 -rw-r--r--  2 root root 0 2006-06-07 17:47 -piripi
32 -rw-r--r--  2 root root 0 2006-06-07 17:47 --piripi2
33 lrwxrwxrwx  1 root root 7 2006-06-07 17:48 -piripi3 -> -piripi
first64:~# find . -inum 32
./-piripi
./--piripi2
first64:~# find . -inum 32 -exec rm {} \;
first64:~# ls -li -- -*piripi*
33 lrwxrwxrwx  1 root root 6 2006-06-02 13:37 -piripi3 -> -piripi

Para evitar que alguien se pierda, las operaciones que hemos ido haciendo son:

  1. Creamos un fichero llamado "--piripi".
  2. Hacemos un enlace duro llamado "--piripi2" que apunta a "-piripi".
  3. Hacemos un enlace blando llamado "-piripi3" que apunta, de nuevo, a "-piripi".
  4. Listamos los ficheros que contengan la cadena "piripi" en su nombre (nótese como el archivo original y el enlace duro tienen el mismo número de inodo, no así el enlace blando).
  5. Buscamos en el directorio actual los ficheros cuyo inodo sea el 32.
  6. Repetimos la operación, pero esta vez los borramos dle tirón.
  7. Y finalmente, volvemos a listar los ficheros que contienen la cadena "piripi" en su nombre.

Podríamos también saber el inodo de un fichero con stat, pero apuesto que con ls es más directo y sin tanta información extra.


Comentarios (3)


Volver al indice

login, admin, form, register