Come posso eliminare tutte le directory vuote in una directory dalla riga di comando?


58

Di 'che ho una directory chiamata foo/. Questa cartella include sottodirectory. Come posso eliminare tutte le directory vuote in un comando?

Risposte:


119

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.


Penso che questo sia il modo più semplice per farlo, quindi vado avanti e lo segnerò come risposta.
justingrif,

Ehi Bill, ho provato a pubblicare un'altra domanda simile e non mi avrebbe permesso perché diceva che era un imbecille, quindi speravo che tu potessi essere in grado di rispondermi qui. Supponiamo che volessi fare la stessa cosa sopra ma rimuovere tutte le directory, siano esse vuote o meno.
Justingrif,

3
Il modo in cui si rimuovere le directory, a prescindere dal fatto che essi sono vuoti, digitare il seguente comando: 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.
Bill

E se ci fossero alcuni file nella suddetta directory che volevo conservare. Quindi, volevo eliminare tutte le directory in / foo / bar / ma mantenere tutti i file che potrebbero essere lì.
justingrif,

2
È possibile farlo usando una pipe per alimentare il 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.
Bill

11

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.


8
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

Questo non è adatto per gli script in quanto uscirà con un codice di stato diverso da zero ma funziona.
the_drow,

@the_drow come lo rende inadatto? A proposito puoi anche usare rmdir * 2>/dev/null || true. (Il modo find (1) è migliore per lo scripting ma per altri motivi: perché esprime meglio quello che vuoi fare.)
Alois Mahdal,

Lo faccio spesso a $HOME. Con un sorriso malvagio.
Alois Mahdal,

Perché segnalerà un errore se alcune directory non sono vuote.
the_drow,

è più veloce del metodo find? Qualcuno ha confrontato i due?
Xerus,

1
find . -type d -empty -delete -maxdepth 1

Per se si desidera eliminare solo le sottodirectory dirette di foo/.


0

Approccio Python

$ 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ì:

  • usiamo la 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.
  • la prima comprensione della lista ci consente di creare emptyla lista di tutte le directory che sono vuote, in base alla valutazione di cui sopra.
  • seconda funzione, 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)

troppo complicato per semplici domande :(
nurulhudamustaqim

@nurulhudamustaqim Dipende dal punto di vista. Per molti utenti Linux che sono abituati a Python questo è in realtà molto modesto :) E oltre alla sua varietà. La moderna amministrazione di sistema non si limita a bash o /bin/shsolo e Python è in realtà un linguaggio più elegante di quei due
Sergiy Kolodyazhnyy,
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.