Odpowiedzi:
Użyłbym find dirname -not -empty -ls, zakładając, że GNU znajdzie.
lsa 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 +0to mówi find, aby szukał plików o rozmiarze większym niż 0bajty. 0moż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 fprzełącznik powyżej. To mówi find, aby znaleźć tylko pliki. Jak zauważono w komentarzach poniżej, -printzmiana nie jest tak naprawdę potrzebna.
-maxdepth 1wcześniej umieścić -size +0. -printJest to również akcja domyślna, więc nie jest potrzebna.
findróż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 -sizewcześ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 Lkwalifikator 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 lsnie 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