Перелік файлів у каталозі, що включає вміст підпапок із сортуванням


9

Я хочу перерахувати весь вміст каталогу, включаючи вміст підпапок, але відсортований за розміром файлів. До цих пір мені вдалося дістатись до списку та сортування, в той час як досі рекурсивні ls -lhSR( hце приємно мати, але, безумовно, не важливо для мене, поки я можу отримати розміри файлів). Я, мабуть, не помічаю чогось очевидного або запитую неможливе, але будь-яка порада тут буде дуже вдячна.

Відповіді:


15

Ви можете використовувати find:

find . -type f -printf "%s %P\n" | sort -n

Необов’язково: для перетворення значень байтів у формат, прочитаний людиною, додайте це:

| numfmt --to=iec-i --field=1

Пояснення:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

О прекрасно! Дуже дякую, це зробило саме те, що мені потрібно!
томи

3
Я радий, що моя відповідь допомогла тобі. Будь ласка, поставте прапорець ліворуч, щоб позначити відповідь прийнятою. Дякую.
pLumo

1
@RoVo також було б непогано відповісти на це питання, оскільки, враховуючи, що ви відповіли на нього, ви, напевно, вважали його цікавим та корисним.
тердон

Це дійсно правда, і я це зробив зараз ;-)
pLumo

@toms Добре почекати деякий час (можливо, день або близько того), щоб прийняти відповідь, навіть коли це так добре, як цей. Після того, як відповідь буде прийнята, інший варіант не може виявитися ще кращим. І через це багато людей не будуть намагатися подавати будь-які інші відповіді, тому ми не отримуємо шансів побачити їх, щоб дізнатися, чи є хто краще.
Monty Harder

7

Оскільки ви не вказали конкретну оболонку, ось альтернатива, використовуючи класифікатори zsh за допомогою

setopt extendedglob

для рекурсії. Тоді наприклад:

  1. рекурсивно перераховувати прості файли:

    printf '%s\n' **/*(.)
  2. рекурсивно перелічимо звичайні файли, про rdered шляхом в биговки L ength (тобто розмір):

    printf '%s\n' **/*(.oL)
  3. рекурсивно список звичайних файлів, O rdered по де розміру гибочного:

    printf '%s\n' **/*(.OL)
  4. рекурсивно перераховуйте прості файли, упорядковані за зменшенням розміру, та виберіть найкращі 3 результати:

    printf '%s\n' **/*(.OL[1,3])

Якщо ви також хочете розмірів файлів, тоді ви можете використовувати

du -hb **/*(.OL[1,3])

4

За допомогою globstarнабору параметрів оболонки ви можете використовувати глобул:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

Якщо ви спробуєте це з занадто великою кількістю файлів, ви отримаєте помилку "Аргумент надто довгий". Для роботи навколо цього, ви можете використовувати printfі xargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

Я щойно зрозумів, що це друкує каталоги (розміром 4096 байт) - якщо ви цього не хочете, скористайтеся цим:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

Приклад виконання

$ tree
.
├── edits.png
├── makescript
├── new
   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

Приємне рішення. У порівнянні з пошуком, він не включає приховані файли, як це досягти?
pLumo

@RoVo Завжди забувайте про це - вам просто потрібно встановити dotglobваріант оболонки, дивіться мою оновлену відповідь.
десерт

Замість того, щоб знімати каталоги після факту з sed, ви можете розглянути щось на кшталтprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
steeldriver

Ви можете використовувати, ls -lhSd **/*якщо ви не заперечуєте, щоб каталоги були частиною списку. Або якщо в них немає жодного імені вашого каталогу ., і всі файли, які ви хочете зробити , ви можете ll -hS **/*.*, або подібні.
Пітер Кордес

перетворив це на відповідь
Пітер Кордес

3

Якщо у вас немає zsh, ви все одно можете використовувати du+ sort:

  1. Читані людиною розміри, включаючи сукупні розміри каталогів:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Лише файли (з використанням find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

В обох випадках, я вирішив використовувати завершальний нуль лінії ( -0, -z, -print0опціони), щоб бути безпечними проти всіх дійсних імен файлів.


0

shopt -s globstarДуже приємно швидке інтерактивне використання дерев каталогів, які не надто величезні . Глобус не може фільтрувати каталоги на основі типу, але якщо ви користуєтесь ним, ls -dтоді lsбуде просто надрукувати ім'я каталогу, а не вміст.

Якщо ваш llпсевдонім передбачає -lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

дасть такий вихід (з мого каталогу коду-гольфу), але з кольоровим виділенням (тому простіше бачити каталоги). Зауважте, що сортування за розміром файлів відбулося в підкаталогах.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

Ви можете відфільтрувати каталоги, провівши їх grep -v '^d'

Іноді ви можете використовувати глобус, який відповідає лише файлам, а не каталогам, якщо ваші імена файлів мають шаблон. наприклад ll -rSd **/*.jpg, або навіть **/*.*працює , якщо жоден з ваших імен каталогів не мають .в них, і всі файли , які ви хочете зробити .

(Для людей з фоном DOS: *.*у Unix немає нічого магічного . Він просто відповідає будь-якій записи в каталозі, яка містить буквальну крапку. Але крім виконуваних файлів та іноді текстових файлів, звичайно давати розширення для імен файлів.)

@dessert вказує, що вам потрібно, shopt -s dotglobщоб він відповідав усім файлам.


З ГНУ find

Якщо в одному lsкомандному рядку не надто багато файлів , find -exec ls {} +розмістіть їх у командному рядку, де їх lsможна буде сортувати.

find -not -type d -exec ls --color -lrSh {} +

Використання -not -type dзамість цього не -type fдозволяє ігнорувати символьні посилання, названі труби, розетки, файли пристроїв та все інше, про що ви клацаєте у своїх каталогах.


З du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

Тепер імена каталогів сортуються за списком із загальною сумою всього їх вмісту, але окремі файли все ще включаються.

sort -hвін також --human-numeric-sortсортує номери з суфіксами розміру, як du -hвідбитки. Він ідеально підходить для використання з du.

Я часто використовую du -sch * | sort -hабо */отримую лише каталоги.

du -sch **/* | sort -hВи дасте вищенаведений результат, якщо ви забудете, що duє -aваріант.

(Я лише зайняв час, щоб роздивитись її, тому що я публікую відповідь. Для інтерактивного використання я, мабуть, тільки що використовував du -sch **/*.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.