Я в основном ищу файлы, затем сортирую по размеру. Сценарий работает, если я не сортирую размер по удобочитаемому человеку. Но я хочу, чтобы размер был удобочитаемым. Как я могу сортировать размеры, удобочитаемые человеком?
Например:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Это работает, как и ожидалось, я получил размер моих файлов в байтах по возрастанию:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Теперь я хочу, чтобы размер читался человеком, поэтому я добавил параметр -h в ls, и теперь некоторые файлы вышли из строя:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- как это работает?ls
выходных данныхdu
вместоls
может быть хорошей идеей.find
«s-printf
с его%p
и%s
форматтерами ( с последующим„гуманизацией“размеров).Ответы:
Пытаться
sort -h k2
Это часть сортировки gnu, BSD и других.
источник
ls
следует избегать парсинга вывода ?ls
и вместо этого напрямую использовать глобализацию файлов. Один шарик здесь не подойдет. Тем не менее, я бы предпочелdu
для этого.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(я могу ошибаться при переключении тестовых символов ). Если вас не интересуют символические ссылки,files=(*); echo ${#files[@]}
которые становятся переносимыми, если вы используете,set
а не массивы.ls
имеет встроенную функциональность, используйте-S
опцию и сортируйте в обратном порядке:ls -lShr
источник
-h
не является стандартнымls
вариантом , но должен использоваться, если OP уже имеет его. Остальные стандартные, и это, конечно, ответ, который я бы написал.ls
.-S
может быть недоступно для васls
. FWIW-S
поддерживается даже библиотекой Emacsls-lisp.el
, которая используется, когда ОС не имеетls
. Это работает в Emacs на MS Windows, например.-h
не может быть универсально доступен, но OP уже использует его в любом случае.-S
действительно должен быть общедоступным, потому что он находится в ссылке POSIX, которую предоставляет Тоби. Тем не менее, существует довольно много наборов инструментов, отличных от POSIX.Поскольку никакой конкретной оболочки не было упомянуто, вот как все это сделать в
zsh
оболочке:**
Модель Глоба соответствует как ,*
но через/
в имени пути, то есть как бы рекурсивный поиск.Команда
ls
включила бы удобочитаемые размеры с-h
, и длинный формат вывода списка с-l
. В-f
опции отключает сортировку, такls
просто список файлов , в том порядке , они получают.Этот порядок упорядочен по
**/*(.Lk-1024oL)
шаблону подстановки имени файла, так что меньшие файлы перечислены первыми.**/*
Бит соответствует каждый файл и каталог в этом каталоге и ниже, но(...)
модифицирует поведение Глоб ( в это «Глоб классификатор»).В
oL
конце упорядочивает (o
) имена по размеру файла (L
"длина").В
.
начале заставляет глобус соответствовать только обычным файлам (без каталогов).В
Lk-1024
бит выбирает файлы, размер которых составляет менее 1024 Кб ( «длина в КБ менее чем 1024»).Если
zsh
не ваша основная интерактивная оболочка, то вы можете использоватьИспользуйте
setopt GLOB_DOTS
(илиzsh -o GLOB_DOTS -c ...
) также для сопоставления скрытых имен. ... или просто добавитьD
к строке квалификатора glob.Расширяя вышесказанное, предполагая, что вы хотите вывод в 2 столбца с именами путей и удобочитаемыми размерами, а также предполагая, что вы используете
numfmt
GNU coreutils,или, быстрее,
источник
Если у вас
sort
нет-h
опции, вы можете использовать (хотя и очень длинную) команду awk, как показано ниже:Это отсортирует ваши выходные данные в байтах, а затем преобразует их в их удобочитаемый размер.
источник
Будет ли это работать?
Первый
awk
exp будет искать файлы размером менее 1M, а второй возьмет из результата размер в байтах, преобразует его в КБ и напечатает первые 3 элемента, чтобы получить читабельный размер.источник