Як відобразити розміри файлів, "читабельних для людей", у результатах пошуку?


11

Я намагаюся знайти всі великі файли на моєму сервері Centos. Для цього я використовую:

find / -maxdepth 10 -size +100000 -ls

Я спробував змінити -lsдо , -lshале це не допускається.

Як я можу відобразити ці результати за допомогою читаних людьми розмірів (за допомогою суфіксів k, M,…)?


Яке ваше визначення для людини читається? Для мене це достатньо читабельно для людини.
— манатурка

Спробуйте скористатися fileпрограмою find.
— Рамеш

@manatwork kb, mb, gb
— blarg

Відповіді:


10

findне має складних варіантів, як-от ls. Якщо ви хочете ls -h, вам потрібно зателефонувати ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Я рекомендую -xdevможливість уникнути повторного повторення в інших файлових системах, що було б марно, якщо ви турбуєтеся про дисковий простір.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Якщо ви використовуєте zsh як свою оболонку, то замість цього findви можете використовувати глобальні класифікатори. Обмеження розміру файлу просте: з Lнаступним розміром; розмір може мати додаткову одиницю перед номером. Якщо ви не піклуєтеся про максимальну глибину, ви можете використовувати **/для повторного переходу в підкаталоги. Якщо ви дбаєте про максимальну глибину, вона більш громіздка, оскільки у шаблонів zsh glob немає способу виразити "щонайбільше n подій". Щоб уникнути повторної рекурсії на пристрої, використовуйте dглобальний класифікатор; вам потрібно знайти номер пристрою, який ви можете відобразити за допомогою statкоманди під Linux ( stat -c %d /для відображення лише номера) або за допомогою statвбудованого zsh (запустіть, zmodload zsh/statщоб завантажити його).

ls -lh /**/*(L+M99d$(stat -c %d /))

4

Команда, яку ви намагаєтесь, для мене читабельна. Однак ви можете скористатись утилітою файлів із знахідкою, як показано нижче.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Ще один спосіб зробити це - за допомогою команди нижче.

du -BM / | sort -nr

Вищенаведена команда надасть вам файли в сортованому розмірі файлу.

Якщо ви використовуєте coreutils> 7.5 , ви можете випустити команду нижче, щоб перелічити файли за розмірами.

du -ah / | grep -v "/$" | sort -h

У моїй машині у мене не було sort -hдоступних варіантів.

Як ви вже згадували в коментарі, ваш читабельний для людини формат - це файл, який повинен мати розмір у kb , mb або gb . Я б пішов із другою командою, яку я опублікував як відповідь. Вихід, який я отримав, коли використовував його в своїй системі,

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking

Чи є спосіб встановити нижню межу для вашої другої команди? Найбільші файли з’являються вгорі і швидко зникають з верхньої частини оболонки EDIT - я бачу, вам просто потрібно видалити r
— blarg

Ви можете перенаправити вихід на файл, додавши > outputдо команди. Тоді ви можете відкрити файл і переглянути результат за своїм бажанням :)
— Рамеш,

Я бачу, що тут відображаються і папки, тоді як я лише після файлів
— blarg

du -a --max-depth=10 / | sort -rnце близькість, яку я міг би придумати. Однак у цьому випадку розмір не відображатиметься в KB, MB або GB.
— Рамеш

1

Я думаю, що те, що ти шукаєш, більше схоже на наступне.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

-execДозволяє виконати команду і {}заміщаються в результаті знахідки. Нарешті, +це сказати знайти, що це кінець команди, і це потрібно.


2
Насправді тут зовсім непотрібно цитувати {}. Одиничні лапки в команді призначені для оболонки, але оболонка ніколи не збирається бачити ls -lah <args...>команду - вона бачить {}, що не потрібно цитувати. Це те, findщо бачить ls -lah {}і findрозширює {}, і, як випливає з назви -execопції, findвикористовує exec*системний виклик аргументів безпосередньо, тому проблем з пробілами findне виникне, тому що не збирається робити розбивання слів на ваші імена файлів.
— jw013

1
-aОпція lsне потрібна , так як аргументи , як очікується, будуть файли , а не каталоги. GNU знаходить використання ls -dilsдля цього -lsваріанту, щоб повторити те, що було б найбільш близько ls -dilsh.
— jw013

man find наводить наступне для першого прикладу використання -exec : find . -type f -exec file '{}' \; запускає файл на кожному файлі в поточному каталозі або нижче. Зауважте, що дужки укладені в єдині лапки, щоб захистити їх від інтерпретації як пунктуації сценарію оболонки. Точка з комою аналогічно захищена за допомогою зворотної косої риски, хоча в цьому випадку могли бути використані і окремі лапки.
— Тім Х'юз

1
Сторінка man просто виступає за певну обережність. Це не зашкодить, але я не знаю жодної оболонки, яку потрібно {}цитувати.
— jw013
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.