lunes, 12 de noviembre de 2018

Manipulación de ficheros que empiezan con un guión

En esta ocasión vamos a ver el tratamiento que hay que dar a los ficheros cuyo nombre comienza con un guión, dado que las técnicas habituales de uso de caracteres de escape para no tratar los caracteres especiales no funcionan.
Veamos un ejemplo clásico:
$ echo "HOLA" > tm?p
$ rm tm\?p
rm: remove regular file 'tm?p'?
Como se observa, el caracter “?” es considerado como un caracter especial, y para referirse a él como un simple caracter y no como un símbolo especial, hay que usar el caracter de escape “\” antecediéndolo.
Sin embargo, esto no ocurre si el nombre del fichero comienza con un guión intermedio:
$ echo "HOLA" > -tmp
$ rm -tmp
rm: invalid option -- 't'
Try 'rm ./-tmp' to remove the file '-tmp'.
Try 'rm --help' for more information.
$ rm \-tmp
rm: invalid option -- 't'
Try 'rm ./-tmp' to remove the file '-tmp'.
Try 'rm --help' for more information.
$ rm "-tmp"
rm: invalid option -- 't'
Try 'rm ./-tmp' to remove the file '-tmp'.
Try 'rm --help' for more information.
Los errores mostrados indican que el comando usado (rm en este caso, pero puede ser otro cualquiera) considera el guión como el comienzo de un parámetro.
Vamos a ver dos métodos para referirnos a los ficheros que comienzan con un guión.

Método 1

Esta forma es la más habitual. Consiste en nombrar al fichero usando una ruta completa o relativa al mismo:
$ rm ./-tmp
rm: remove regular file './-tmp'? 
$ rm /tmp/-tmp
rm: remove regular file '/tmp/-tmp'?
Método 2
La segunda opción consiste en indicar al comando que deje de interpretar los parámetros que se le pasan. Para ello, se usan dos guiones intermedios seguidos de un espacio:
$ rm -- -tmp
rm: remove regular file '-tmp'?