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 findcomando 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' -emptyopzione è valida per qualsiasi file e directory che è vuota.
L' -type dopzione è valida per il tipo di file specificato; in questo caso dsta per il tipo di file directory .
L' -deleteopzione è 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' -ropzione significa eliminare in modo ricorsivo, mentre il -fcomando significa non chiedere conferma prima dell'eliminazione. Se si desidera essere richiesto prima di eliminare una directory / file, tuttavia, sostituire l' -fopzione con l' -iopzione.
stdoutcomando di un comando (ad es. find) stdinNell'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 manpagine 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 rmdirrifiuto del comando di eliminare directory non vuote e find -depthdall'opzione per attraversare l'albero delle directory dal basso verso l'alto:
find . -depth -exec rmdir {} \;
(e ignora gli errori), oppure aggiungi 2>/dev/nullper ignorarli davvero.
L' -depthopzione per findiniziare a trovare nella parte inferiore della struttura di directory.
rm -rfcancellerà 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, scontiene un elenco di directory all'interno re fconterrà un elenco di file in quella cartella. Naturalmente se fe ssono vuoti, sappiamo che rè vuoto.emptyla 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 emptynell'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/shsolo e Python è in realtà un linguaggio più elegante di quei due