it-swarm-es.tech

¿Cómo elimino un archivo cuyo nombre comienza con "-" (guión a.k.a. guión o menos)?

¿Cómo se elimina un archivo cuyo nombre de archivo comienza con un guión (guión o menos) -? Estoy en un servidor OSX remoto y tengo este archivo en mi directorio:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

¿Cómo en el mundo puedo eliminar --help de una CLI? Este problema es algo que encuentro en diferentes formas en ocasiones, estos archivos son fáciles de crear, pero difíciles de eliminar.

He intentado usar la barra invertida

rm \-\-help

He intentado citas

rm "--help"

¿Cómo evito que el carácter menos (guión o guión) se interprete como una opción?

377
Bryan Rehbein

Use "-" para hacer que rm deje de analizar las opciones de la línea de comandos, así:

rm -- --help
559
Vegar Nilsen

O puedes hacer

rm ./--help
236
edfuh

Use find para hacerlo:

find . -name '--help' -delete

Y este es un buen método porque si tiene más de unos pocos archivos como este que puede eliminar, puede obtener una lista de vista previa de los archivos simplemente ejecutando find sin el -delete opción primero, y luego si la lista de archivos se ve bien, ejecútala nuevamente con -delete.

De hecho, evitar rm a favor de find (especialmente con la vista previa primero) es un buen hábito que te ayudará a evitar errores con rm * que inevitablemente te morderá algún día.

Tenga en cuenta, sin embargo, que find se repetirá en todos sus subdirectorios, por lo que es posible que desee ejecutarlo con una restricción de profundidad de subdirectorio como esta:

find . -maxdepth 1 -name '--help' -delete

que limita la búsqueda al directorio actual.

41
aculich

Las respuestas de Vegar Nilsen y edfuh son muy buenas y las soluciones adecuadas para un problema como este.

Quiero agregar una respuesta general a esta pregunta que le permita eliminar cualquier archivo con un nombre de archivo difícil. Primero se obtiene su número de inodo usando ls -i o alguna forma de stat y luego el archivo se elimina buscando archivos en el directorio actual por número de inodo y ejecutando el comando rm en el archivo con un número de inodo coincidente

find . -inode <inode> -exec rm {}\;

Dado que los números de inodo son únicos en cada sistema de archivos, puede eliminar cualquier archivo con esto; Unicode o utilizando caracteres de escape. Es muy molesto escribir, así que recomendaría agregar la línea

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

en tu .inputrc file si estás usando bash. Esto le permite recorrer la lista de posibles finalizaciones ( para más información ).

21
Baldur

Una solución brutal:

Perl -e "unlink '--help' or die 'Could not unlink.';"

Perl -e "rmdir '-d' or die 'Could not rmdir.';"
11
Thomas L Holaday

Tutorial de Linux para crear un archivo con guiones y espacios, luego eliminarlo

¡TEN CUIDADO! No ejecutes accidentalmente un rm -rf / o un comando similar de eliminación en cascada.

Si su archivo que está tratando de eliminar incluye asteriscos o barras diagonales, no bombee accidentalmente un . o /* o * o algún otro comodín que podría eliminar en cascada su sistema operativo.

Cree un archivo llamado "--yo yo"

[email protected] ~ $ touch -- "--yo yo"
[email protected] ~ $ ls
bin  --yo yo

Primero, encuéntralo con find:

[email protected] ~ $ find . -name "*--yo yo*"
./--yo yo

Asegúrese de que el comando find SOLO encuentre el archivo ONE que desea eliminar:

Luego pasa la opción -delete para buscar, para eliminarlos:

[email protected] ~ $ find . -name "*--yo yo*" -delete
[email protected] ~ $ ls
bin  

Aaaannd se ha ido.

8
Eric Leschinski

Midnight Commander (mc) es el más fácil, solo apúntalo y presiona F8;)

2
Marcin

aquí hay una solución que había usado antes de encontrar este hilo.
use vim para 'editar' el directorio:

vim .

luego (en vim) seleccione su archivo, presione Supr y confirme la eliminación.
cuando haya terminado, salga de vim con :q

1
atti

¿Has intentado agregar el nombre del directorio como prefijo:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

El uso del directorio como prefijo del archivo en general ayuda a evitar que la función del analizador interprete incorrectamente el carácter "menos" como una opción de comando.