Muszę znaleźć puste katalogi dla podanej listy katalogów. Niektóre katalogi zawierają katalogi.
Jeśli katalogi wewnętrzne są również puste, mogę powiedzieć, że katalog główny jest pusty, w przeciwnym razie nie jest pusty.
Jak mogę to sprawdzić?
Na przykład:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Odpowiedzi:
Sprawdź, czy
find <dir> -type f
coś wyświetla. Oto przykład:for dir in A B C; do [ -z "`find $dir -type f`" ] && echo "$dir is empty" done
źródło
-type f
służy.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- i uruchomię kod w mojej odpowiedzi, zgłosi, że B i C są puste, zgodnie z wymaganiami OP. Będziesz więc musiał być bardziej szczegółowy niż „to nie zadziała”.Zależy to trochę od tego, co chcesz zrobić z pustymi katalogami. Używam poniższego polecenia, gdy chcę usunąć wszystkie puste katalogi w drzewie, powiedzmy
test
katalog.find test -depth -empty -delete
Jedną rzeczą, na którą należy zwrócić uwagę w powyższym poleceniu, jest to, że usunie ono również puste pliki , więc użyj opcji -type d , aby tego uniknąć.
find test -depth -type d -empty -delete
Upuść,
-delete
aby zobaczyć dopasowane pliki i katalogi.Jeśli twoja definicja pustego drzewa katalogów jest taka, że nie zawiera ono żadnych plików, możesz skleić coś razem w oparciu o to, czy
find test -type f
coś zwraca.find
to świetne narzędzie, a RTFM wcześnie i często, aby naprawdę zrozumieć, ile może zrobić :-)źródło
-empty
, tak wygodne!find test -name ".DS_Store" -delete
najpierw, a następnie-empty delete
polecenie. Zwróć także uwagę, jak dopushd
katalogu nadrzędnego, więc staniefind test
sięfind .
, ale reszta poleceń jest taka sama.-depth
tutaj, tj. Przyczyń się do znalezienia, aby wykonać przejście w głąb, tj. Katalogi są odwiedzane w kolejności końcowej i wszystkie wpisy w katalogu będą działały przed samym katalogiem. Myślę, że jest to istotne tutaj.Możesz użyć następującego polecenia:
find . -type d -empty
źródło
find directory -mindepth 1 -type d -empty -delete
To jest wersja, która była dla mnie najbardziej interesująca. Jeśli zostanie wykonany z wnętrza katalogu , usunie wszystkie puste katalogi poniżej (katalog jest uważany za pusty, jeśli zawiera tylko puste katalogi).
Opcja mindepth zapobiega usunięciu samego katalogu, jeśli jest on pusty.
źródło
rmdir --ignore-fail-on-non-empty -p directory
zrobić, aby pozbyć się również rodziców.find . -type d -empty
znajduje i wyświetla puste katalogi i podkatalogi w bieżącym drzewie. Np. Wynikowa lista pustych katalogów i podkatalogów:
Na katalogach nie jest wykonywana żadna operacja. Są po prostu wymienione. To działa dla mnie.
źródło
Po prostu znajdź puste reżery
Aby znaleźć puste katalogi (jak określono w tytule pytania), odpowiedź mosg jest poprawna:
find -type d -empty
Ale
-empty
może nie być dostępny w bardzo starychfind
wersjach (tak jest na przykład w przypadku HP-UX ). W takim przypadku zapoznaj się z technikami opisanymi w poniższej sekcji Czy katalog jest pusty? .Usuń puste książki
Jest to trochę skomplikowane: załóżmy, że katalog
MyDir
zawiera puste katalogi. Po usunięciu tych pustych katalogówMyDir
stanie się pustym katalogiem i również powinien zostać usunięty. Dlatego używam poleceniarmdir
z opcją--parents
(lub-p
), która usuwa również katalogi nadrzędne, jeśli to możliwe:find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
W starszej
find
wersji instrukcja+
nie jest jeszcze obsługiwana, dlatego możesz użyć;
zamiast niej:find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Czy katalog jest pusty?
Większość z tych odpowiedzi wyjaśnia, jak sprawdzić, czy katalog jest pusty. Dlatego przedstawiam tutaj trzy różne techniki, które znam:
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir if [ x$(find "$d" -prune -empty) = x"$d" ] then echo "empty (directory or file)" else echo "contains files (or does not exist)" fi
odmiana:
d=your/dir if [ x$(find "$d" -prune -empty -type d) = x"$d" ] then echo "empty directory" else echo "contains files (or does not exist or is not a directory)" fi
Wyjaśnienie:
find -prune
jest podobny dofind -maxdepth 0
użycia mniejszej liczby znakówfind -type d
drukuje tylko katalogifind -empty
wypisuje puste katalogi i pliki> mkdir -v empty1 empty2 not_empty mkdir: created directory 'empty1' mkdir: created directory 'empty2' mkdir: created directory 'not_empty' > touch not_empty/file > find empty1 empty2 not_empty -prune -empty empty1 empty2
(( ${#files} ))
Ta sztuczka jest w 100%,
bash
ale wywołuje (spawnuje) podpowłokę. Pomysł pochodzi od Bruno De Fraine i został ulepszony przez teambob komentarzem . Radzę to, jeśli używaszgrzmotnąć i jeśli twój skrypt nie musi być przenośny.files=$(shopt -s nullglob dotglob; echo your/dir/*) if (( ${#files} )) then echo "contains files" else echo "empty (or does not exist or is a file)" fi
Uwaga: nie ma różnicy między pustym katalogiem a katalogiem nieistniejącym (nawet jeśli podana ścieżka jest plikiem).
[ $(ls -A your/dir) ]
Ta sztuczka została zainspirowana artykułem nixCraft opublikowanym w 2007 roku. Andrew Taylor odpowiedział w 2008 roku, a gr8can8dian w 2011 roku.
if [ "$(ls -A your/dir)" ] then echo "contains files" else echo "empty (or does not exist or is a file)" fi
lub jednowierszowa wersja bashism:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Uwaga:
ls
zwraca,$?=2
gdy katalog nie istnieje. Ale nie ma różnicy między plikiem a pustym katalogiem.źródło
rmdir -vp
bardzo mi pomogło, ponieważ musiałem nie tylko usunąć wszystkie puste katalogi w katalogu głównym, ale sprawdzić puste katalogi i katalogi nadrzędne po usunięciu pliku. W mojej sytuacji puste katalogi są w porządku, o ile nie ma ich w drzewie, z którego obecnie usuwam plik. Dzięki!Wydaje się, że ta rekurencyjna funkcja załatwia sprawę:
# Bash findempty() { find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir do if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null then findempty "$dir" echo "$dir" fi done }
Biorąc pod uwagę przykładową strukturę katalogów:
Wynikiem działania tej funkcji byłby:
który chybia
/dir4/dirD
. Jeśli przeniesiesz wywołanie rekurencyjnefindempty "$dir"
po znakufi
, funkcja uwzględni ten katalog w swoich wynikach.źródło
A co powiesz
rmdir *
? To polecenie zakończy się niepowodzeniem w przypadku niepustych katalogów.źródło
rmdir */*/* */* *
chociaż nie obsługuje plików z kropkami, ale w sytuacjach ręcznych (czyszczenie plików danych) generalnie nie spodziewasz się plików z kropkami. Metody rekurencyjne służą jednak do bardziej zautomatyzowanego ogólnego czyszczenia, szczególnie w bardzo dużych strukturach katalogów.Poniższe polecenie zwraca 1, jeśli katalog jest pusty (lub nie istnieje), a 0 w przeciwnym razie (więc można odwrócić kod powrotu
!
w skrypcie powłoki):find $dir -type d -prune -empty -exec false {} +
źródło
Stworzyłem prostą strukturę w następujący sposób:
test/ test/test2/ test/test2/test2.2/ test/test3/ test/test3/file
test/test3/file
Zawiera jakiś tekst śmieci.Wystawienie
find test -empty
zwraca „test/test2/test2.2
” jako jedyny pusty katalog.źródło
prostym podejściem byłoby:
$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"
również,
if [ "$(ls -A /path/to/direcory)" ]; then echo "its not empty" else echo "empty directory"
źródło
find . -name -type d -ls |awk '($2==0){print $11}'
źródło