2009-04-01 14 views
66

Tengo algunos archivos en mi máquina Unix que comienzan con¿Cómo eliminar archivos comenzando con doble guion?

-- 

por ejemplo, --testings.html

Si trato de quitarlo me sale el siguiente error:

cb0$ rm --testings.html 
rm: illegal option -- - 
usage: rm [-f | -i] [-dPRrvW] file ... 
     unlink file 

me trataron

rm "--testings.html" || rm '--testings.html' 

pero nada funciona.

¿Cómo puedo eliminar dichos archivos en el terminal?

+0

Lo mismo en [serverfault] (https://serverfault.com/questions/47003/deleting-a-unix-directory-with-a-hyphen-in-the-name) y [unix] (https: // unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-begins-with-hyphen-aka-dash-or-minus). – Dorian

+1

@Dorian Bien, pero fui el primero :) – cb0

Respuesta

140
rm -- --testings.html 

La opción -- dice rm para tratar todos los argumentos adicionales como nombres de archivo, no como opciones, incluso si comienzan con -.

Esto no es particular para el comando rm. La función getopt lo implementa y muchos (¿todos?) Comandos al estilo UNIX lo tratan de la misma manera: -- finaliza el procesamiento de opciones, y todo lo que sigue es un argumento normal.

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

+0

exactamente lo que necesito, gracias – cb0

+4

Esto no es estándar en todas las versiones de Unix, aunque sí funciona en la mayoría. Vea la respuesta de vatine para una alternativa que funciona con todas las versiones. –

17

De cualquier rm -- --testings.html o rm ./--testings.html.

1
rm ./--testings.html 

o

rm -- --testings.html 
55
rm -- --somefile 

Mientras que funciona, es una solución que se basa en rm utilizando getopts para analizar sus opciones. Hay aplicaciones que hacen su propio análisis sintáctico y vomitarán también (porque es posible que no implementen necesariamente la lógica "-- significa fin de las opciones").

Debido a eso, la solución que debe conducir a través de su cráneo es éste:

rm ./--somefile 

Siempre va a funcionar, porque de esta manera sus argumentos no comienzan con un -.

Por otra parte, si está tratando de hacer secuencias de comandos de shell realmente decentes; técnicamente debe poner ./ delante de todas las expansiones de parámetros de nombre de archivo para evitar que se rompan los scripts debido a la entrada de nombre de archivo funky (o para evitar que sean abusados ​​/ explotados para hacer cosas que no deberían hacer; por ejemplo, rm eliminar archivos pero omitir directorios, mientras que rm -rf * eliminará todo. Pasar un nombre de archivo de "-rf" a un script o alguien touch ~victim/-rf 'ing podría utilizarse de esta manera para cambiar su comportamiento con consecuencias realmente malas).

+2

+1 porque tiene razón, pero hacer que las secuencias de comandos sean a prueba de balas es un problema completamente diferente además de tratar con un nombre de archivo incómodo. Si la pregunta era "¿cómo elimino los archivos que comienzan con guiones o que contienen espacios,;, <>, $ y otros elementos no deseados maliciosos? Entonces necesitaría la respuesta completa :-) –

4

Otra forma de hacerlo es utilizar find ...-name "- *" -delete

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
3

Para un enfoque más generalizado para la eliminación de archivos con caracteres imposibles en el nombre del archivo, una opción es utilizar el i-nodo 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 para borrarlo, con la ayuda del hallazgo:

$ find ./ -inum 452998712 -exec rm \{\} \; 

Este proceso puede ser beneficioso cuando se trata de un montón de archivos con peculiaridades nombre de archivo, ya que puede ser fácilmente secuencias de comandos.

+1

Eso funciona solo porque invoca' rm' con el argumento './-- testings.html'. Es más fácil simplemente escribir 'rm ./-- testings.html' directamente, que tampoco necesita recorrer todo el árbol de directorios. (Podría evitar esto último usando '-maxdepth 1'.) –