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


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.