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

Если у Вас нет GNU grep доступный, вот что-то более портативное:

grepc()
{
  pattern=$1
  shift
  esc=$(printf "\033")
  sed 's"'"$pattern"'"'$esc'[32m&'$esc'[0m"g' "$@"
}

Можно настроить цвет с помощью одного из этих кодов

30m black
31m red
32m green
33m yellow
34m blue
35m magenta
36m cyan
37m white

Используя 7m вместо цветового кода поместит строку в обратное видео.

2
29.01.2015, 02:16
2 ответа

, Если ваш находят поддержки это, можно использовать %s в -printf ("Размер файла в байтах").

, Если ваш вид поддержки nul-разграниченный вход (-z), можно затем сделать:

find . -type f -printf "%s %f\0" | sort -nz | tr '\0' '\n'
2
27.01.2020, 22:00

Если ваша система поддерживает команду zsh, то в скрипте bash вы можете запустить

zsh -c 'ls -lhS -- **/*(.D)'

Это, вероятно, требует некоторого объяснения:

  • zsh: кроме bash, более мощная оболочка с большим количеством функций
  • -c: воспринимаем следующий аргумент как команду для выполнения zsh
  • ls -lhS: в соответствии с вашим вопросом это команда, которую вы хотите выполнить
  • --: позаботится о странных именах файлов, которые могут начинаться со знака - символа
  • **: glob - совпадение по нескольким каталогам
  • *: стандартный glob - совпадение по всем файлам в этих каталогах
  • (): glob qualifiers, определяющие, какие файлы и в каком порядке должны быть выбраны
  • . : мы выбираем только простые файлы (эквивалент типа f в find)
  • D: включаем точечные файлы (скрытые файлы) в результат

После повторного прочтения вопроса я полагаю, что вы предпочитаете удалить из результата весь путь, а не только ведущую часть. Это все еще можно сделать с помощью zsh:

print -l **/*(.OLDe:'reply=${REPLY##*/}':)

, но это может быть не слишком много, так как речь не идет о трюках zsh, поэтому я предложу "стандартное" решение с помощью find + sed:

find . -type f -exec sh -c 'ls -lhS "$@" | sed "s| \..*/| |"' {} \+
2
27.01.2020, 22:00

Теги

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