Я хотів би перерахувати всі файли в порядку великого до малого розміру, і файли можуть бути присутніми де-небудь у певній папці.
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
).