Все,
Я хочу перечислить 5 лучших файлов изображений (png, jpg) в данной папке.Какой лучший подход? Я использую следующее в настоящее время, но это не дает правильный вывод:

find . \( -iname \*.png -o -iname \*.jpg \)  -exec ls -lrhS {} \; | sort -n | head -5 | awk '{print $9, "=>",$5}'

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

5 ответов5

1

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

find . \( -iname \*.png -o -iname \*.jpg \) -print0 | xargs -0 ls -l | sort -k5 -r | head -5

Я обработаю этот вывод, чтобы получить вывод в желаемом формате (то есть с суффиксами, такими как B, K)

1

Если в «топ - 5» вы имеете в виду по размеру, то вам нужно указать , какой столбец sort для сортировки; значение по умолчанию будет проходить через все столбцы по порядку, то есть изначально будет сортироваться по количеству ссылок. Кроме того, без какого-либо расширения "читаемый человеком" размер не будет сортироваться вообще разумно, за исключением sort GNU; Переносимая sort -n не знает о суффиксах типа B , K и т. д. Также обратите внимание, что вы теряете информацию сортировки, о которой вы просили ls потому что она запускается для отдельных файлов под управлением find . И затем ваш sort сортируется по убыванию , так что даже исправляя, вы получаете пять самых маленьких изображений из head . (И является ли || перед awk опечаткой? Вы говорите, что запускаете awk только в случае сбоя конвейера find .)

Комбинируя все это и оптимизируя с помощью xargs для объединения вещей и объединения head в awk , вам нужно убедиться, что вы используете sort GNU, а затем использовать

find . \( -iname \*.png -o -iname \*.jpg \) -print0 | xargs -0 ls -lh | sort -k5gr,5 | awk 'NR <= 5 {print $9, "=>", $5}'
1
find . \( -iname "*.png" -o -iname "*.jpg" \) -printf "%k\t%p\n" | sort -rn | head -5
  1. Использует поиск в соответствии с вашими требованиями в текущем каталоге (я предполагаю, что вы имеете в виду «текущий каталог И подкаталоги, в противном случае добавьте -maxdepth 1).
  2. Размер отпечатков (в блоках по 1К), затем вкладка, затем имя файла.
  3. Сорта численно поменялись местами.
  4. Выбирает первые пять строк.

и вуаля!

(Возможное предостережение - имена файлов, содержащие переводы строк, но на практике я никогда не видел их. Требуется некоторая простая модификация, чтобы учесть это)

0

Вы имеете в виду "верх" как самый большой по размеру? S в вашей команде ls уже сортирует по размеру, но r меняет порядок в обратном порядке, сортируя наименьшую сверху. Возможно, вы хотите попробовать -exec ls -lhS {} \; | head -5 (пропустить отдельную sort).

0

Вроде очень просто:

find . -ls | sort -nk7 | tail -5

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .