Odpowiedzi:
Użyłbym find dirname -not -empty -ls
, zakładając, że GNU znajdzie.
ls
a ty wykorzystałeś find
;) Podniosłem jednak ... To właściwe rozwiązanie
Jest to praca, ponieważ find ls nie jest wystarczająco potężny.
find -maxdepth 1 -size +0 -print
-maxdepth 1
- to mówi find, aby przeszukał tylko bieżący katalog, usuń, aby przejrzeć wszystkie podkatalogi lub zmień liczbę, aby zejść o 2, 3 lub więcej poziomów.
-size +0
to mówi find, aby szukał plików o rozmiarze większym niż 0
bajty. 0
można zmienić na dowolny rozmiar.
-print
mówi find, aby wydrukować pełną ścieżkę do znalezionego pliku
Edycja:
późne dodawanie: prawdopodobnie powinieneś również dodać -type f
przełącznik powyżej. To mówi find, aby znaleźć tylko pliki. Jak zauważono w komentarzach poniżej, -print
zmiana nie jest tak naprawdę potrzebna.
-maxdepth 1
wcześniej umieścić -size +0
. -print
Jest to również akcja domyślna, więc nie jest potrzebna.
find
różnią się znacznie pod względem tego, jakie są prawidłowe opcje i gdzie mogą się udać. GNU find
(co jest okropnie powszechne) wyświetli ostrzeżenie, jeśli zostanie wprowadzone -size
wcześniej -maxdepth
.
Ls prawie nie ma opcji filtrowania plików: to nie jest jego zadanie. Filtrowanie plików jest zadaniem powłoki dla prostych przypadków (poprzez globbing) i wyszukiwaniem dla skomplikowanych przypadków.
W zsh możesz L
kwalifikator globbing zachować tylko pliki o rozmiarze> 0 ( .
kwalifikator ogranicza się do zwykłych plików):
ls *(.L+0)
Użytkownicy innych powłok muszą użyć find. Z GNU find (jak najczęściej w Linuksie):
find -maxdepth 1 -type f ! -empty -exec ls {} +
Sposobem zgodnym z POSIX jest:
find . -type f -size +0c -exec ls {} + -o -name . -o -prune
Jeśli ls
nie był tylko przykład, a ty po prostu zamierza oględziny, można sortować według wielkości: ls -S
.
Bash 4.0+
shopt -s globstar
shopt -s nullglob
for file in **/*; do test -f "$file" && [[ -s "$file" ]] && echo "$file"; done