Как перечислить все файлы, заказанные размером

/tmp может быть и иногда, убран на перезагрузке. /var/tmp сохраняется между перезагрузками.

См. статью Wikipedia о FHS.

259
22.02.2016, 00:17
10 ответов

Вы могли использовать что-то, любят, находят и вид.

find . -type f -ls | sort -r -n -k7

( -ls опция не является стандартной, но найдена во многих, находят реализации, не только GNU один. В GNU находят и другие, он отображает что-то подобное ls -li за немногим исключением, например, файлы с ACLs не отмечены с +),

Если имена файлов могут содержать символы новой строки, с GNU находят и вид GNU:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
26
27.01.2020, 19:27
  • 1
    Это принимает столбец "группы" (от-ls) не содержащий любые пробелы (следовательно параметр-k 7), но он не обязательно имеет место. –  kolistivra 03.11.2014, 18:00
  • 2
    Это принимает столбец "группы" (от-ls) не содержащий любые пробелы (следовательно параметр-k 7), но он не обязательно имеет место. –  kolistivra 03.11.2014, 18:00
  • 3
    , почему не просто выполнение находят...-print0 | вид-zk7rn0? –  Andre de Miranda 28.09.2016, 13:24

Просто используйте что-то как:

ls -lS /path/to/folder/

Капитал S.

Это отсортирует файлы по размеру.

Также см.:

man ls

-S     sort by file size

Если Вы хотите отсортировать в обратном порядке, просто добавьте -r переключатель.

Обновление:

Для исключения каталогов (и если ни одни из имен файлов или целей символьной ссылки не содержат символы новой строки):

ls -lS | grep -v '^d' 

Обновление 2:

Я вижу теперь, как это все еще показывает символьные ссылки, которые могли быть папками. Символьные ссылки всегда начинаются с буквы l, как в ссылке.

Измените команду для фильтрации для a -. Это должно только оставить регулярные файлы:

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 (значение использования диска - человекочитаемый), и затем сортируют вывод снова. Если Ваш find/sort не поддерживает -h, замена du -k и sort -rn. Обратите внимание, что размер и использование диска не являются тем же самым.

305
27.01.2020, 19:27
  • 1
    du дает использование диска, которое отличается от размера файла. С (GNU) du -h, числовой вид не будет работать (Вам будет нужно -h Опция GNU отсортировать). xargs ожидают список возможно заключенных в кавычки слов, как введено, таким образом, он не будет работать, если имена файлов будут содержать пробелы или заключенные в кавычки символы. –  Stéphane Chazelas 04.11.2012, 01:57
  • 2
    я вижу, что-S делает убывающий порядок размера, что относительно порядка по возрастанию? –  demongolem 08.03.2016, 17:40
  • 3
    После @StéphaneChazelas это работает на меня: find . -type f -print0 | xargs -0 du -h | sort -rh. Если Вы просто хотите, говорят самые большие 30 файлов: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30. –  user7543 16.05.2016, 14:13

С zsh и GNU ls:

ls -ldU -- **/*(.OL)

Где (.OL) спецификатор шарика, . выбрать регулярные файлы только, OL к обратному порядку длиной (размер файла, o для порядка по возрастанию, O для убывания).

(обратите внимание, что более старые версии zsh имели проблемы с размерами файла по 2^32).

Некоторые операционные системы имеют предел на размер списка аргументов, переданного команде. В тех случаях Вам было бы нужно:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Если Вы просто хотите список файлов а не подробного результата, просто сделайте:

print -rl -- **/*(.OL)

Если Вы хотите включать скрытые файлы (чье имя запускается с точки, кроме . и ..) и поиск в скрытых каталогах также, добавляют D спецификатор globbing:

print -rl -- **/*(.DOL)
10
27.01.2020, 19:27

Высказывание, что "файлы могли присутствовать где угодно в определенной папке", подразумевает, что Вы хотите рекурсивно убывать все каталоги (папки) в начальном каталоге (папка). Это что find предназначен, чтобы сделать:

find . -type f -exec ls -lSd {} +

Это "находит" все файлы в текущем рабочем каталоге (.). Для каждого найденного файла, ls процесс выполняется для сортировки объектов, найденных в порядке размера. + разделитель к -exec причины несколько аргументов, которые будут переданы как список ls. Если Ваш каталог (папка) не содержит очень большое количество файлов, у Вас должен быть один список (и таким образом один разветвленный процесс), ведя к результату, которого Вы требуете.

7
27.01.2020, 19:27
  • 1
    это хорошо, поскольку он позволяет Вам использовать-h модификатор на ls для показа хороших размеров файла –  shmish111 16.05.2015, 11:48

Я записал что-то до этой степени некоторое время назад. Вы могли передать аргумент для определения сколько файлов, чтобы перечислить, или просто ввести big, в том, какой случай Вы получаете 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
2
27.01.2020, 19:27

Попробуй это, мне подходит.

$ найдите /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + головка | -n 10 | awk '{ печатает $5, $9 }'

Не идеальный ответ, но работает в некоторой степени

$ ls -lS |grep  '^-' | head -n 6 
3
27.01.2020, 19:27

Эту же команду sed можно упростить, указав, сколько узоры пространства слов требуется сопоставить. У меня не было больших строковых файлов, чтобы проверить его, но без циклов в вашем исходном сценарии это должно выполняться так быстро, как ваш процессор может передавать данные. Дополнительные преимущества, это будет одинаково хорошо работать с многострочными файлами.

n=500; sed -r "s/((\w+\s){$n})/\1\n/g" <input.txt >output.txt
-121--36153-

Последовательность

mount ... | logger
rc=$?

не работает так, как ожидалось: возвращаемое значение трубы является возвращаемым значением последнего элемента в этой трубе.

$> false | true; echo $?
0

Если используется bash, попробуйте PIPESTATUS :

$> false | true; echo $? ${PIPESTATUS[0]}
0 1
$> true | false; echo $? {PIPESTATUS[0]}
1 0

PIPESTATUS является переменной массива. Подробности на странице bash. Другие снаряды могут иметь что-то похожее на PIPESTATUS

-121--65362-

Добавление к ответу Делх и комментарий Стефана Шазеласа...

find -print0 в сочетании с xargs -0 добавляет поддержку пробелов/пробелов/whatnots.

du -h | sort -rn неправильно сортируется между различными кратными байтами, например, 1.1M будет отображаться после 128K, что неправильно.

sort -rh (--человечно-числовая сортировка) заботится об этом, но работает только на версии GNU.

Команды, приведенные ниже, обеспечивают требуемые выходные данные.

Читаемый человеком, на GNU sort/Linux:

find. -type f -print0 | xargs -0 du -h | sort -rh

В килобайтах на BSD/OSX/others:

find. -type f -print0 | xargs -0 du -k | sort -rn

Для получения информации о BSD/OSX см. также https://unix.stackexchange.com/a/188375/82895 .

1
27.01.2020, 19:27

Отображение списка файлов в обратном порядке: ls -lSrh

Для возрастания: ls -lSh

4
27.01.2020, 19:27

Как вариант исходного вопроса, если вы хотите увидеть совокупный размер файлов в подкаталогах:

#!/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/debian apt install ncdu), а также на osx (brew install ncdu).

1
27.01.2020, 19:27

Список файлов по размеру по возрастанию будет выглядеть так:

ls -lSr

Опции:

  • l: длинный, показывает подробные атрибуты пользователя, группы, другие атрибуты, дату и т.д.
  • S: упорядочивает список по размеру (по умолчанию по убыванию)
  • r: изменяет порядок списка
9
27.01.2020, 19:27

Теги

Похожие вопросы