Jak znaleźć wszystkie puste pliki i foldery w określonym katalogu, w tym pliki, które wyglądają na puste, ale nie są?


18

Powiedzmy, że w moim folderze ~/listmam dużą liczbę folderów z własnymi podfolderami i podfolderami itp. I prawie na każdym poziomie jest wiele plików. Jednak niektóre z tych plików i folderów są puste, więc jak mogę rekurencyjnie je przeszukiwać, aby znaleźć puste pliki i foldery? A następnie wyświetlaj je na liście lokalizacji plików, aby wiedzieć, gdzie jest każda z nich (powinno być również jasne, który jest plikiem, a który folderem, ponieważ nie wszystkie pliki mają rozszerzenia plików). Używam Ubuntu GNOME 15.10 z GNOME 3.18.

Zauważ , że byłoby to bardzo przydatne, gdyby powiedział mi również, czy plik wygląda na pusty, ale nie jest (na przykład, jeśli zawiera spacje lub podziały wierszy lub coś takiego). Rozróżniałby między naprawdę pustym plikiem a plikiem, który wygląda na pusty w danych wyjściowych.


1
Pusty plik, czy plik nie zawiera znaków? (mogą to być spacje, podziały linii i tabulatory)?
Jacob Vlijm

@JobobVlijm: Cóż, wcześniej myślałem tylko o plikach, które mają 0 bajtów, ale teraz, kiedy o tym wspominasz, ktoś mógł być na tyle szalony, aby dać mi plik ze spacjami lub łamaniem linii lub coś takiego, więc chciałbym je również wykryć, ale chciałbym, aby dane wyjściowe rozróżniały rzeczywisty pusty plik od tego, który wygląda na pusty.

Odpowiedzi:


25

Od man find

    -empty File is empty and is either a regular file or a directory.

Wystarczy więc znaleźć zarówno puste pliki, jak i katalogi

find ~/lists -empty

Aby wskazać typ, można użyć specyfikatora %yformatu wyjściowego

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

na przykład

find ~/lists -empty -printf '%y %p\n'

lub skorzystaj z zewnętrznego programu, takiego jak ls, który zawiera --classifyopcję

    -F, --classify
          append indicator (one of */=>@|) to entries

to znaczy

find ~/lists -empty -exec ls -Fd {} \;

Jeśli twoja definicja „pustych” zostanie rozszerzona o pliki zawierające tylko białe znaki, staje się bardziej skomplikowana - i bardziej intensywna obliczeniowo, ponieważ teraz musisz faktycznie otworzyć przynajmniej niepuste pliki i zbadać ich zawartość. Najskuteczniejszym sposobem, w jaki mogę myśleć z góry, byłoby coś takiego

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(albo pusty, albo plik AND grep nie wykrywa co najmniej jednego niepustego znaku). Prawdopodobnie istnieje lepszy sposób.


Przepraszam, że coś przeoczyłem, spójrz na edytowaną wersję mojego pytania. Nie powinno być zbyt wiele do dodania.

11

Z ~/listfolderu:

find . -empty -type d

do wyświetlania pustych katalogów i

find . -empty -type f

do wyświetlania pustych plików.

find . -type f -exec bash -c 'if [ `cat "{}" |wc -w` -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

do wyświetlania pustych folderów i plików, w tym białych znaków i pustych linii


Czy będzie to rekurencyjnie wyświetlało również podfoldery i ich zawartość?

pokaże rekurencyjnie puste pliki i foldery
EdiD

Przepraszam, że coś przeoczyłem, spójrz na edytowaną wersję mojego pytania. Nie powinno być zbyt wiele do dodania.

[ `grep -c [[:alnum:]] "{}"` -eq 0 ]przepuści pliki zawierające tylko znaki spoza [A-Za-z0-9]zestawu.
Kos

@kos - prawdopodobnie wykres zamiast alnum wykona zadanie
EdiD
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.