Я хотів би перерахувати всі файли в порядку великого до малого розміру, і файли можуть бути присутніми де-небудь у певній папці.
man ls:-S sort by file size
Я хотів би перерахувати всі файли в порядку великого до малого розміру, і файли можуть бути присутніми де-небудь у певній папці.
man ls:-S sort by file size
Відповіді:
Просто використовуйте щось на кшталт:
ls -lS /path/to/folder/
Capital S .
Це дозволить сортувати файли за розміром.
Також дивіться:
-S sort by file size
Якщо ви хочете сортувати у зворотному порядку, просто додайте -rперемикач.
Оновлення:
Щоб виключити каталоги (і за умови, що жодне з імен файлів або цілей символьного посилання не містить символів нового рядка):
ls -lS | grep -v '^d'
Оновлення 2:
Зараз я бачу, як він все ще показує символічні посилання, які можуть бути папками. Символічні посилання завжди починаються з літери l, як у посиланні.
Змініть команду для фільтрування для -. Тут слід залишати лише звичайні файли:
ls -lS | grep '^-'
У моїй системі це відображаються лише звичайні файли.
оновлення 3:
Щоб додати рекурсію, я б залишив сортування рядків у sortкоманді і сказав їй використовувати 5-й стовпчик для сортування.
ls -lR | grep '^-' | sort -k 5 -rn
-rnозначає Зворотний і числовий, щоб отримати найбільші файли вгорі. Нижня частина цієї команди полягає в тому, що вона не показує повний шлях файлів.
Якщо вам потрібен повний шлях до файлів, використовуйте щось подібне:
find . -type f -exec du -h {} + | sort -r -h
findКоманда рекурсивно знайти всі файли в усіх вкладених каталогах в .і виклику du -h( що означає використання дискового -humanreadable ) , а потім відсортувати вихідні знову. Якщо ваш find/ sortне підтримує -h, замініть du -kі sort -rn. Зауважте, що розмір та використання диска - це не одне і те ж.
duдає використання диска, яке відрізняється від розміру файлу. З (GNU) du -hчислове сортування не працюватиме ( -hдля сортування вам знадобиться опція GNU). xargs очікує введення списку можливо цитованих слів, тому воно не працюватиме, якщо назви файлів містять пробіли або цитовані символи.
find . -type f -print0 | xargs -0 du -h | sort -rh. Якщо ви просто хочете сказати , найбільші 30 файлів: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
+ |синтаксис + | sort -r -h?
Ви можете використовувати щось на кшталт пошуку та сортування.
find . -type f -ls | sort -r -n -k7
( -lsопція не є стандартною, але вона зустрічається у багатьох реалізаціях знаходження, не тільки в GNU. У GNU find та ін. вона відображає щось подібне, ls -liза кількома винятками, наприклад, файли з ACL не позначені знаком +)
Якщо імена файлів можуть містити символи нового рядка, GNU find та GNU сортують:
find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
З zsh та GNU ls:
ls -ldU -- **/*(.OL)
Де (.OL)є глобальний класифікатор , .вибирати лише звичайні файли, OLзмінювати порядок по довжині (розмір файлу, o для порядку зростання, Oдля зменшення).
(зауважте, що у старих версіях zsh виникли проблеми з розмірами файлів понад 2 ^ 32).
Деякі операційні системи мають обмеження щодо розміру списку аргументів, переданого команді. У цих випадках вам знадобиться:
autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU
Якщо ви просто хочете список файлів, а не детальний вихід, просто виконайте:
print -rl -- **/*(.OL)
Якщо ви хочете включити приховані файли (ім’я яких починається з крапки, за винятком .і ..), а також шукати в прихованих каталогах, додайте Dкласифікатор глобалізації:
print -rl -- **/*(.DOL)
.OL? Це частина команди?
ls (GNU coreutils) 8.25і zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Це працює лише для певних версій lsі zsh?
Список файлів за розміром за зростанням буде:
ls -lSr
Варіанти:
Якщо говорити про те, що "файли можуть бути присутніми в будь-якій точці певної папки", це означає, що ви хочете рекурсивно скидати всі каталоги (папки) в межах початкового каталогу (папки). Це те find, що потрібно зробити:
find . -type f -exec ls -lSd {} +
Це "знаходить" всі файли в поточному робочому каталозі ( .). Для кожного знайденого файлу lsзапускається процес для сортування об'єктів, знайдених за розміром. +Термінатор на -execпричинах численних аргументів, переданих в списку ls. Якщо ваш каталог (папка) не містить дуже великої кількості файлів, у вас повинен бути один список (і, таким чином, один роздвоєний процес), що призводить до бажаного результату.
Відображення списку файлів у зворотному порядку: ls -lSrh
Для порядку зростання: ls -lSh
Я щось писав до цього ступеню назад. Ви можете передати аргумент, щоб вказати, скільки файлів у списку, або просто набрати big, у такому випадку ви отримаєте 10.
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
Спробуйте ці, мені це добре працює.
$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10
# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'
Хоча не ідеальна відповідь, але працює певною мірою
$ ls -lS |grep '^-' | head -n 6
sedдля скорочення випуску
Додавши відповідь Дельха та коментар Стефана Шазеласа ...
find -print0в поєднанні з xargs -0підтримкою пробілів / пробілів / нотаток.
du -h | sort -rn не сортується належним чином між різними байтовими кратностями, наприклад, 1,1 М покаже після 128 К, що неправильно.
sort -rh (- людсько-числовий сорт) піклується про це, але він працює лише у версії GNU.
Команди нижче нададуть потрібний вихід.
Людина, що читається, за типом GNU / Linux:
find . -type f -print0 | xargs -0 du -h | sort -rh
У кілобайтних одиницях на BSD / OSX / інші:
find . -type f -print0 | xargs -0 du -k | sort -rn
Для BSD / OSX див . Також https://unix.stackexchange.com/a/188375/82895 .
Як варіант початкового питання, якщо ви хочете побачити накопичений розмір файлів у підкаталогах:
#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr
Розміри відображатимуться в Мегабайти ( mв du -sm). Інші значення , прийняті duв -kкілобайти, -gгігабайти. Використання -hдля читаного для людини відображення неможливо, оскільки воно порушить сортування.
Ось версія, яка використовує sedдля додавання Mмегабайт:
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'
Налаштовується каталог, що відображається, за допомогою ${1:-.}якого використовувати аргумент першого командного рядка, якщо він наданий, або використовувати поточний каталог, якщо викликається без аргументів.
ПРИМІТКА. Це може зайняти багато часу, коли багато файлів. Цей параметр -type dвідображатиме лише підкаталоги та виключає файли у поточній папці; якщо ви також хочете побачити файли в поточній папці, тоді видаліть їх.
Примітка: можливо, ви хочете використовувати
ncduзамість цього доступний у більшості Linux-репостів (на ubuntu / debianapt install ncdu), а також у osx (brew install ncdu).