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.