¿Qué comando necesito usar para eliminar un archivo llamado `-rf`?

67

Hice algo loco en algún momento que creó un archivo llamado -rfen mi sistema de archivos.
Ahora no puedo entender cómo eliminarlo ...

He intentado:

rm "-rf"
rm \-rf

Estos solo salen inmediatamente, arrgh!

¿Alguien sabe cómo eliminar este archivo? Preferiblemente sin limpiar accidentalmente toda mi carpeta.

Pierre-Antoine LaFayette
fuente
33
¡Algún nervio al intentar rmun archivo llamado -rfdesde su sistema sin recordar la sintaxis exacta!
ChristopheD
3
Para explicar por qué eso no funciona: las cotizaciones y los escapes son analizados por su shell (generalmente bash), y luego el resultado del análisis se pasa a rm(in it argcand argv) Por lo tanto, ambos dan como resultado que la matriz ["rm", "-rf"]se pase a rm, que hace lo que esperarías.
Thanatos
3
Creo que esto está más cerca de un duplicado de este de Unix y Linux stackexchange: unix.stackexchange.com/questions/1519/…
frabjous
12
Una vieja mordaza es obtener un archivo nombrado *en una carpeta. Incluya uno nombrado -rftambién y mire la diversión ;-)
RBerteig
@RBerteig: mkdir './-rf '(ls --classify, un valor predeterminado común en un alias de shell, agregará un /)

Respuestas:

127
unlink -rf

O

rm -- -rf
Josh Lee
fuente
47
Esta es la solución más útil para aprender IMO, porque '-' para detener el procesamiento de argumentos está estandarizado en todas las herramientas de GNU
Nathan O'Sullivan
1
Para ser más precisos, cualquier cosa que use GNUgetopt tiene --, lo que debería significar la mayoría de las herramientas modernas de Linux.
Geoffrey Zheng
60

Otra opción:

rm ./-rf

... asumiendo que su directorio actual es el que reside el archivo.

Martin Clayton
fuente
34

Alternativamente, siempre puede editar el directorio en el que está y eliminar el archivo de esa manera.

vim .

y luego simplemente elimine la línea con el archivo (usando D, dd no funcionará).

oadams
fuente
55
¡buen truco! [Varios caracteres inútiles]
Sergio Acosta
No pensé que esto mereciera los votos negativos que tenía cuando vi esta respuesta por primera vez esta tarde, pero no tuve la oportunidad de verificar que vimtenía un modo directo. Claramente, la edición del directorio en sí en un editor de texto no es recomendable ni posible sin un verdadero salto de aro experto. Tenga en cuenta que emacstambién funcionaría, y por la misma razón.
RBerteig
1
¡Puntos extra por el uso inteligente de Vim! :)
Pierre-Antoine LaFayette
es bueno saberlo;)
schöppi
25

Se utiliza una técnica genérica para eliminar nombres de archivos extraños.

 ls -li

para encontrar el número de inodo del archivo y luego usarlo.

find ./ -inum <number of file> -delete

No es necesario recordar todos los casos especiales.

usuario51427
fuente
44
No sabía que findtenía el poder de eliminar archivos.
zneak
Esto también es ideal para capturar archivos con nombres desconocidos (comenzando con o incluyendo caracteres de retroceso o con espacios en blanco adicionales al final), siempre que tenga acceso a un hallazgo decente de GNU en su caja.
Olfan
17

Aunque conozco el truco "rm - -filename", generalmente cuando de alguna manera obtengo un archivo con un encabezado, en su nombre que quiero eliminar, inicio un administrador de archivos GUI y lo hago desde allí, para eliminar la posibilidad de errores

Heptita
fuente
1
Es posible que no tenga una GUI en absoluto, por lo que esto podría no funcionar.
Wuffers
12
Si fue estúpido e incorrecto, tal vez merezca un voto negativo, pero no creo en rechazar esta respuesta solo porque "podría no funcionar". Ningún daño puede venir de esta sugerencia.
JT.WK
44
Siempre hay un comandante de medianoche (u otros administradores de archivos basados ​​en maldiciones) para aquellos sin X.
thomasrutter
9

Si solo quieres estar seguro:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
ene
fuente
4

En caso de que estés en un Unix que no sea GNU donde te sientas arrastrado de vuelta a la edad de piedra (sin --sintaxis, sin -inumcambio para encontrar, sin comando de desvinculación, tu editor rechaza editar directorios, etc.) aún puedes ayudarte a ti mismo:

find . -name '-rf' -print | xargs rm -i

Esto hará que find alimente a todos los candidatos potenciales para rm, lo que a su vez solicitará permiso / denegación para cada archivo que se alimente.

En caso de rmque ni siquiera sea compatible con el -iconmutador (¿HP-UX 10.2 en PA-RISC 1.1?), Tenga más cuidado:

find . -name '-rf' -print
# check that find's output is exactly and only what you need to delete
find . -name '-rf' -print | xargs rm
Olfan
fuente
¿Qué pasa si su sistema ni siquiera tiene find?
Lie Ryan
Eso sería malvado de hecho. Por desgracia, todavía tengo que cumplir con una instalación de Unix sin una. ¿Me puede dar un puntero?
Olfan
Pensándolo bien, mi respuesta habría sido más apropiada si la pregunta se hiciera en serverfault. No es muy probable que los Superusuarios tengan maquinaria tan antigua como las que me refiero. Y los que lo hagan habrán aprendido a ayudarse a sí mismos. ;-)
Olfan
1, @Olfan, en el que la defensa, alguien acaba de encontrarse con una herencia UNIX en un armario en algún lugar todavía necesita un recurso para aprender trucos y consejos de ...
RBerteig
3

Apoyando la respuesta de jleedev , mejoraría con:

rm -i -- -rf

estar en modo interactivo y solicitar confirmación, para que pueda estar seguro de lo que elimina. (aunque la solución está bien. Es simplemente para su tranquilidad)

En realidad, incluso usa eso:

\rm -i -- -rf

para estar seguro de que no estás usando ningún alias.

haylem
fuente
2

Como ya se ha sugerido, siempre he usado la sintaxis

rm -rf -- filename

cuando tuve que eliminar un archivo con un guión como prefijo porque - le dice al comando que no busca ningún otro parámetro sino solo nombres de archivo.

Teniéndolo en cuenta, para proteger mi carpeta importante mediante la eliminación accidental de archivos, estaba acostumbrado a crear un archivo vacío llamado simplemente -i que normalmente se coloca en la parte superior de la lista de archivos al resolver la búsqueda *. Entonces el comando

rm -rf *

cuando se ejecuta en mi carpeta protegida se explota, durante la ejecución, en el comando:

rm -rf -i filename1 filename2 .... (all the other files in the folder)

y el shell, en lugar de eliminar todo inmediatamente, deja de pedir una confirmación (como requiere la opción -i).

Ghidello
fuente
+1 para el -ipirateo del nombre de archivo: "I" era escéptico, ¡pero se prueba!
rymo
2

La última vez que tuve este problema, lo resolví con:

pitón

importar os

os.remove ("- rf")

Jono
fuente
1

Martin Clayton tiene razón.

Es muy simple y lógico. Si se dan las opciones es siempre -XXX, o --CCCCpor lo que si se pone una ./o la ruta completa -rfno puede ser considerado como una opción y se le considera como una cadena normal.

Funciona con "todos" los nombres de archivos extraños.

#pwd
/ tmp / TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
# #
Louis
fuente
1

rm - -rf la mayoría de las herramientas de GNU aceptan - como marcador de fin de opciones

Konrads
fuente