Eliminazione di una directory UNIX con un trattino nel nome


13

Attraverso una manovra a testa bassa da parte mia, ho accidentalmente creato una directory chiamata (ad esempio) -A, e ho finito per riempirlo di file.

Voglio cancellare detta directory. Ho provato:

rmdir -- -A

ma poi mi dice che la directory contiene ancora dei file. E non riesco a capire come cd nella directory per eliminare tali file.

Cosa devo fare per sbarazzarmi di questa fastidiosa directory?


5
Fortunatamente la directory non è stata chiamata '-rf *'.
user1686,

Lo stesso su stackoverflow e unix .
Dorian,

Risposte:


29

Usa - su ogni 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 ..

11

Puoi mettere ./ davanti al file - in questo modo rm o rmdir non si comporteranno come se il nome del file fosse un flag di opzione.

Puoi anche emettere l'opzione - che dice a rm di agire come se tutto ciò dopo - sia un nome file e che non debba elaborare altre opzioni. Potrebbero esserci versioni precedenti funky di rm che non obbediscono a ciò, anche se il mio zoo di antichi unix è diventato piuttosto piccolo in questi giorni, quindi non posso dirti quali o se ci sono versioni che non capiscono -.

Dovresti prendere l'abitudine di mettere il ./ davanti ai nomi quando elimini comunque - non sai mai se nella tua directory c'è un file -r o -rf. Potresti dire che dovresti sempre usare il - ma trovo che il ./ sia più naturale perché rende esplicito che "Voglio eliminare i file in questa directory, non qualunque cosa * capiti di"



2

rmdir non cancellerà una directory con nulla al suo interno. "rm -rf" lo farà. rmdir è considerevolmente più sicuro di "rm -rf". La risposta di Moo è ancora probabilmente la migliore.


1
rm -fr ./-A

Il comando sopra funziona per me.


0

Un metodo diverso sarebbe quello di eliminare per inode (questo funziona per file / directory con altri caratteri che sono difficili da eliminare 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$

all'rm verrà comunque passato un argomento -A sulla riga di comando e proverà comunque a interpretarlo come un'opzione, quindi è ancora necessario impedirgli di vedere il trattino iniziale in qualche modo (attraverso doppi trattini o mettendo ./ davanti al resto del nome
chris,

La ricerca lo anteporrà automaticamente, poiché stai trovando da ".". Il nome file passato sarà './-A', o qualunque sia il file che potrebbe essere chiamato, anteposto a ./ e correttamente scappato per il comando.
baumgart,

Nit: -execnon sfugge al nome e non è necessario; l'argomento passato tramite uno dei exec*syscalls è il nome reale. È solo l' input della shell che richiede caratteri speciali come l'asterisco punto e virgola ecc. Quotati per ottenere la shell per passare il nome effettivo corretto (SENZA virgolette). Detto questo, find -exec rm -f {}funziona solo per un file, non per una directory come richiesto per questa Q; find -exec rm -rf {}gestisce directory e anche directory non vuote, ma saltare finde semplicemente fare rm -rf ./-Aè molto più semplice.
dave_thompson_085,

0

find può eliminare la directory in questo modo:

find . -type d -iname '-A' -delete

-1

Stavo cercando di eliminare una directory denominata -p. La risposta di @ Moo ha raggiunto ciò che non ero in grado di fare rm ./-p, che è ampiamente disponibile in molte pagine Web dopo una ricerca su Google.

Un altro metodo consiste nell'utilizzare il numero di inode. Ho usato il metodo descritto qui:

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

In breve, utilizzare i seguenti comandi:

  1. Per visualizzare il numero dell'inode del file o della directory.
ls -il
  1. Utilizzare il findcomando utilizzando l' -exec rm -irfargomento per un file o -exec rm -ifdrper una directory.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Assicurati di usare -fall'interno del flag, altrimenti bash si lamenterà di non essere in grado di trovare la directory o il file.

Testato su:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
Questo è quasi il duplicato della risposta di baumgart di 10 anni fa, ma non è necessario rm -de di solito non -fquando si invoca find, ma è necessario disporre -rdi una directory e non di un file. Anche se corretto, questo metodo è ancora goffo e inferiore. Per una directory non vuota basta farlo rm -fr ./-p- questo è r per una directory ef a seconda delle impostazioni di autorizzazione.
dave_thompson_085,

1
Entrambi i metodi erano già stati menzionati nelle risposte precedenti.
RalfFriedl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.