Come eliminare tutti i file e le directory nascosti usando Bash?


28

La soluzione ovvia produce un codice di uscita di 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Una possibile soluzione salterà il "." e ".." ma elimineranno solo i file i cui nomi sono più lunghi di 3 caratteri:

bash$ rm -f .??*

Bene, se non sei troppo preoccupato di non poterlo rimuovere. & .. allora chi se ne frega? a meno che tu non sia preoccupato per un brutto output in uno script, penso che la soluzione ovvia sia meno tipizzante degli altri piuttosto francamente.
Matt,

Solo così sai, .. e. non sono file. Sono riferimenti alle directory. . (solo un singolo punto) è la directory corrente e .. (due punti) è un collegamento alla directory di un livello superiore. Ad esempio, se cd / home / user,. è uguale a / home / user e .. è / home / in altre parole, non è possibile eliminare il file. e .. (.?)
phuzion,

Grazie per il commento Matt. Uso spesso il comando negli script con il controllo del codice di uscita per comando (set -e). In questi casi è necessario un codice di uscita indicativo.
Yonatan Broza,

Non c'è nulla di inerente. e .. che li protegge dalla cancellazione con rm -rf. Questo è solo un meccanismo di protezione aggiunto nelle moderne varianti di rm.
kubanczyk,

E c'è sempre rm -rf. * || vero se vuoi solo aggirare il comportamento set -e per quell'unica istruzione.
Domingo Ignacio Galdos,

Risposte:


34
rm -rf. [^.]. ?? *

Dovrebbe prendere tutti i casi. Il. ?? * corrisponderà solo a 3+ nomi di file di caratteri (come spiegato nella risposta precedente), il. [^.] Prenderà due voci di carattere (diverse da ..).


Grazie per la risposta! Sulla base di esso ho anche ottenuto la versione più breve di "rm -rf. [^.] *".
Yonatan Broza,

4
Fai attenzione con quella versione più corta, darà risultati simili, ma non identici. Non corrisponderà ai nomi con due punti nella parte anteriore (ad esempio "... /" che a volte si vede nascondere rootkit, ecc.)
Russell Heilling

E fai attenzione a fare un controllo PWD o
perdi

Questo non sembra funzionare zsh. Eventuali suggerimenti?
Ryanjillon

Con zshper impostazione predefinita una corrispondenza jolly vuota viene trattata come un errore; mentre con bashesso è semplicemente passato invariato. Per zshcomportarti allo stesso modo puoi usare il comandounsetopt nomatch
Russell Heilling,

1
find -path './.*' -delete

Questo corrisponde a tutti i file nella directory corrente che iniziano con a .e li elimina in modo ricorsivo. I file nascosti nelle directory non nascoste non vengono toccati.

Nel caso in cui volessi davvero cancellare tutto da una directory, find -deletesarebbe sufficiente.


Questo eliminerà tutto, non solo quelle voci che iniziano con.
kasperd,

Oh, sembra che ho letto male la domanda come "elimina tutto, compresi i file nascosti" ... Beh, il mio male.
Fritz,

@kasperd Grazie, ora dovrebbe effettivamente rispondere alla domanda.
Fritz,

0

il modo migliore probabilmente è:

  • trova . -iname. * -maxdepth 1 -type f -exec rm {} \;

cambia rm in ls -l se vuoi solo vedere cosa verrebbe cancellato, per esprimere dettagliatamente l'output potresti voler aggiungere l' opzione -v a rm

  • -type f options dice a find di cercare solo i file (ometti dirs, links etc)
  • -maxdepth 1 dice a find di non passare alle sottodirectory

ps. non dimenticare di terminare '\;'


1
! attento Intendi -iname '. *' O -iname. * Oppure trascinerai dentro. e .. di nuovo comunque.
Domingo Ignacio Galdos,

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

Questo interrompe l'istante in cui hai un file con spazi bianchi nel suo nome.
un CVn il
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.