Відповіді:
Я б використовував find dirname -not -empty -ls
, припускаючи GNU знайти.
ls
і ти скористався find
;) Хоча я підняв… Це правильне рішення
Ця робота для пошуку ls недостатньо потужна.
find -maxdepth 1 -size +0 -print
-maxdepth 1
- це вказує на пошук лише для пошуку поточного dir, видалення, щоб переглянути всі підрежими, або змінити номер, щоб знизитися на 2, 3 або більше рівнів.
-size +0
це говорить про пошук файлів, розмір яких більший за 0
байт. 0
можна змінити на будь-який розмір, який ви хочете.
-print
повідомляє find, щоб роздрукувати повний шлях до знайденого файлу
Редагувати:
Пізнє додавання: Ви, мабуть, також слід додати -type f
перемикач вище. Це говорить про пошук лише для пошуку файлів. І як зазначається в коментарях нижче, -print
комутатор насправді не потрібен.
-maxdepth 1
попередньо -size +0
. Також -print
є типовою дією, тому вона не потрібна.
find
сильно відрізняється з точки зору того, що є дійсними варіантами та куди вони можуть піти. GNU find
(що жахливо поширене) подасть попередження, якщо ви поставите -size
раніше -maxdepth
.
У Ls майже немає можливості фільтрувати файли: це не його робота. Фільтрування файлів - це робота оболонки для простих випадків (через глобалізацію) і завдання пошуку для складних випадків.
У zsh ви можете L
кваліфікувати класифікатор, щоб зберігати лише файли, розмір яких> 0 ( .
класифікатор обмежується звичайними файлами):
ls *(.L+0)
Користувачі інших оболонок повинні використовувати find. З GNU find (як найчастіше в Linux):
find -maxdepth 1 -type f ! -empty -exec ls {} +
POSIX-сумісний спосіб:
find . -type f -size +0c -exec ls {} + -o -name . -o -prune
Якщо ls
не просто приклад , і ви просто збираєтеся візуальний огляд, ви могли б сортувати за розміром: ls -S
.
Bash 4.0+
shopt -s globstar
shopt -s nullglob
for file in **/*; do test -f "$file" && [[ -s "$file" ]] && echo "$file"; done