Eliminar un directorio UNIX con un guión en el nombre

13

A través de una maniobra descabellada de mi parte, accidentalmente creé un directorio llamado (por ejemplo) -A, y terminé llenándolo con archivos.

Quiero eliminar dicho directorio. He intentado:

rmdir -- -A

pero luego me dice que el directorio todavía tiene archivos. Y no puedo entender cómo cd en el directorio para eliminar dichos archivos.

¿Qué debo hacer para deshacerme de este directorio problemático?

Kate Bertelsen
fuente
55
Afortunadamente, el directorio no se llamaba '-rf *'.
user1686
Lo mismo en stackoverflow y unix .
Dorian

Respuestas:

29

Uso - en cada comando.

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
Mugir
fuente
11

Puede colocar ./ ​​delante del archivo, de esa manera rm o rmdir no se comportarán como si el nombre de archivo fuera un indicador de opción.

También puede emitir la opción, que le dice a rm que actúe como si todo después de - fuera un nombre de archivo y que no debería procesar más opciones. Puede haber versiones antiguas y originales de rm que no obedecen eso, aunque mi zoológico de unixes antiguos se ha vuelto bastante pequeño en estos días, así que no puedo decirte cuáles o si hay versiones que no entienden.

De todos modos, debe acostumbrarse a poner el ./ delante de los nombres cuando esté eliminando; nunca se sabe si hay un archivo con nombre -r o -rf en su directorio. Podrías decir que siempre deberías usar el - pero creo que el ./ es más natural porque hace explícito que "Quiero eliminar archivos en este directorio, no lo que * le ocurra".

Chris
fuente
4

Cámbiele el nombre y luego trátelo normalmente:

$ mv -- -A foo
$ find foo
$ rm -rf foo
David Mackintosh
fuente
2

rmdir no eliminará un directorio con nada dentro. "rm -rf" lo hará. rmdir es considerablemente más seguro que "rm -rf". La respuesta de Moo sigue siendo probablemente la mejor.

David Pashley
fuente
1
rm -fr ./-A

El comando anterior funciona para mí.

q0987
fuente
0

Un método diferente sería eliminar por inodo (esto funciona para archivos / directorios con otros caracteres que son difíciles de eliminar con solo rm).

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$
Baumgart
fuente
el rm todavía pasará un argumento -A en la línea de comando e intentará interpretarlo como una opción, por lo que aún debe evitar que vea el guión principal de alguna manera (a través de guiones dobles o poniendo ./ delante del resto del nombre
chris
El hallazgo lo antepondrá automáticamente, ya que está buscando desde '.'. El nombre de archivo pasado será './-A', o como se llame el archivo, antepuesto con ./ y escapado correctamente para el comando.
baumgart
Nit: -execno escapa al nombre, y no necesita hacerlo; El argumento pasado a través de una de las exec*llamadas al sistema es el nombre real. Es solo la entrada del shell que necesita caracteres especiales como el asterisco de punto y coma del espacio, etc., citado para que el shell pase el nombre real correcto (SIN comillas). Dicho esto, find -exec rm -f {}solo funciona para un archivo, no para un directorio como se le solicitó para esta Q; find -exec rm -rf {}maneja el directorio e incluso el directorio no vacío, pero omitir findy simplemente hacer rm -rf ./-Aes mucho más simple.
dave_thompson_085
0

find puede eliminar el directorio de esta manera:

find . -type d -iname '-A' -delete
ThorstenS
fuente
-1

Estaba tratando de eliminar un directorio llamado -p. La respuesta de @ Moo logró lo que no pude rm ./-p, que está ampliamente disponible en muchas páginas web después de una búsqueda en Google.

Otro método es usar el número de inodo. Usé el método descrito aquí:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

En resumen, use los siguientes comandos:

  1. Para mostrar el número de inodo de archivo o directorio.
ls -il
  1. Use el findcomando usando el -exec rm -irfargumento para un archivo o -exec rm -ifdrpara un directorio.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Asegúrese de usar -fdentro de la bandera, de lo contrario bash se quejará de no poder encontrar el directorio o el archivo.

Probado en:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
Andres Salgado
fuente
1
Esto es casi un duplicado de la respuesta de Baumgart de hace 10 años, pero no necesita rm -dnunca y generalmente no -fcuando invoca find, pero necesita -run directorio y no lo necesita para un archivo. Incluso cuando se corrige, este método sigue siendo torpe e inferior. Para un directorio que no rm -fr ./-pesté vacío, simplemente haga : eso es r para un directorio yf según la configuración de permisos.
dave_thompson_085
1
Ambos métodos ya se mencionaron en respuestas anteriores.
RalfFriedl