¿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?
Use "-" para hacer que rm deje de analizar las opciones de la línea de comandos, así:
rm -- --help
O puedes hacer
rm ./--help
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.
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 ).
Una solución brutal:
Perl -e "unlink '--help' or die 'Could not unlink.';"
Perl -e "rmdir '-d' or die 'Could not rmdir.';"
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.
Midnight Commander (mc
) es el más fácil, solo apúntalo y presiona F8;)
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
¿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.