Di 'che ho una directory chiamata foo/
. Questa cartella include sottodirectory. Come posso eliminare tutte le directory vuote in un comando?
Di 'che ho una directory chiamata foo/
. Questa cartella include sottodirectory. Come posso eliminare tutte le directory vuote in un comando?
Risposte:
Prova questo comando:
find . -empty -type d -delete
Il find
comando viene utilizzato per cercare file / directory che corrispondono a un particolare criterio di ricerca dal percorso specificato, in questo caso la directory corrente (da qui la .
).
L' -empty
opzione è valida per qualsiasi file e directory che è vuota.
L' -type d
opzione è valida per il tipo di file specificato; in questo caso d
sta per il tipo di file directory .
L' -delete
opzione è l'azione da eseguire e vale per tutti i file trovati nella ricerca.
rm -rf <directory-name>
. Questo rimuoverà la directory, insieme a tutto il suo contenuto inclusi file e sottodirectory. L' -r
opzione significa eliminare in modo ricorsivo, mentre il -f
comando significa non chiedere conferma prima dell'eliminazione. Se si desidera essere richiesto prima di eliminare una directory / file, tuttavia, sostituire l' -f
opzione con l' -i
opzione.
stdout
comando di un comando (ad es. find
) stdin
Nell'altro (ad es. rm
), Tuttavia, fai molta attenzione poiché potrebbe cancellare o eliminare file / directory che non vuoi Elimina! Per ulteriori informazioni su come eseguire questa operazione, consultare le man
pagine per ciascuno di questi comandi. Per sicurezza, prova sempre queste cose in una directory temporanea prima di provare la cosa reale.
Puoi trarre vantaggio dal rmdir
rifiuto del comando di eliminare directory non vuote e find -depth
dall'opzione per attraversare l'albero delle directory dal basso verso l'alto:
find . -depth -exec rmdir {} \;
(e ignora gli errori), oppure aggiungi 2>/dev/null
per ignorarli davvero.
L' -depth
opzione per find
iniziare a trovare nella parte inferiore della struttura di directory.
rm -rf
cancellerà tutti i file nella directory (e le sue sottodirectory, e ....) E tutte le directory e tutto il resto.
rmdir *
Elimina tutte le directory vuote. Verrà generato un errore per ogni directory e file non vuoti, per impedire che questi errori ingombrino il terminale, utilizzare
rmdir * 2> /dev/null
rmdir * 2>/dev/null || true
. (Il modo find (1) è migliore per lo scripting ma per altri motivi: perché esprime meglio quello che vuoi fare.)
$HOME
. Con un sorriso malvagio.
find . -type d -empty -delete -maxdepth 1
Per se si desidera eliminare solo le sottodirectory dirette di foo/
.
$ tree
.
├── empty_dir1
├── empty_dir2
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
Funziona così:
os.walk()
funzione per camminare ricorsivamente nell'albero delle directory. Su ogni iterazione r
è impostata la cartella corrente a cui stiamo accedendo, s
contiene un elenco di directory all'interno r
e f
conterrà un elenco di file in quella cartella. Naturalmente se f
e s
sono vuoti, sappiamo che r
è vuoto.empty
la lista di tutte le directory che sono vuote, in base alla valutazione di cui sopra.map()
viene utilizzata per eseguire os.rmdir()
su ogni elemento empty
nell'elenco. La comprensione dell'elenco potrebbe essere usata come alternativa.Come script questo sarebbe il seguente:
#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
if not f and not s and r != ".":
empty.append(r)
for i in empty:
os.rmdir(i)
/bin/sh
solo e Python è in realtà un linguaggio più elegante di quei due