bash - ultimas - sed eliminar caracter
¿Cómo eliminar archivos comenzando con doble guion? (7)
Tengo algunos archivos en mi máquina Unix que comienzan con
--
por ejemplo, --testings.html
Si trato de eliminarlo, aparece el siguiente error:
cb0$ rm --testings.html
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
Lo intenté
rm "--testings.html" || rm ''--testings.html''
pero nada funciona.
¿Cómo puedo eliminar esos archivos en la terminal?
O bien rm -- --testings.html
o rm ./--testings.html
.
Otra forma de hacerlo es usar find ... -name "- *" -delete
touch -- --file
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
Para un enfoque más general para eliminar archivos con caracteres imposibles en el nombre de archivo, una opción es usar el inode del archivo.
Se puede obtener a través de ls -i
.
p.ej
$ ls -lai | grep -i test
452998712 -rw-r--r-- 1 dim dim 6 2009-05-22 21:50 --testings.html
Y borrarlo, con la ayuda de find:
$ find ./ -inum 452998712 -exec rm /{/} /;
Este proceso puede ser beneficioso cuando se trata de una gran cantidad de archivos con peculiaridades de nombre de archivo, ya que puede ser fácilmente guionado.
rm -- --somefile
Mientras eso funciona, es una solución que se basa en el uso de getopts para analizar sus opciones. Hay aplicaciones que hacen su propio análisis sintáctico y vomitarán sobre eso también (porque es posible que no implementen necesariamente la lógica " --
significa fin de las opciones").
Por eso, la solución que debe conducir a través de su cráneo es esta:
rm ./--somefile
Siempre funcionará, porque de esta manera tus argumentos nunca comienzan con un -
.
Además, si intentas crear scripts de shell realmente decentes; técnicamente deberías poner ./
al frente de todas las expansiones de parámetros de tu nombre de archivo para evitar que tus scripts se rompan debido a la entrada del nombre de archivo funky (o para evitar que sean abusados / explotados para hacer cosas que no deberían hacer: por ejemplo, rm
borrará archivos pero omitirá directorios, mientras que rm -rf *
eliminará todo. Pasar un nombre de archivo " -rf
" a un script o touch ~victim/-rf
alguien touch ~victim/-rf
''ing podría usarse de esta manera para cambiar su comportamiento con malas consecuencias).
rm -- --testings.html
rm -- --testings.html
La opción --
le dice a rm que trate todos los argumentos adicionales como nombres de archivo, no como opciones, incluso si comienzan con -
.
Esto no es particular al comando rm. La función getopt lo implementa y muchos (¿todos?) Comandos al estilo UNIX lo tratan de la misma manera: --
termina el procesamiento de opciones, y todo lo que sigue es un argumento regular.
http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt
rm ./--testings.html
o
rm -- --testings.html