Если у Вас нет 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
вместо цветового кода поместит строку в обратное видео.
, Если ваш находят
поддержки это, можно использовать %s
в -printf
("Размер файла в байтах").
, Если ваш вид
поддержки nul-разграниченный вход (-z
), можно затем сделать:
find . -type f -printf "%s %f\0" | sort -nz | tr '\0' '\n'
Если ваша система поддерживает команду 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| \..*/| |"' {} \+