Где находится KEYDEF в команде сортировки?

Я бы написал на Perl один -лайнер:

perl -wE 'for (@ARGV) {rename $_ => s/\d+/500 + $&/re or die $!}' file*

Это перебирает каждое имя файла, вычисляет новое имя файла, добавляя 500 к числовой части, а затем переименовывает файл.

1
29.03.2021, 03:13
1 ответ

F — номер поля, по умолчаниюкоманда sortопределяет поле как текст, окруженный пробелами. Опции -b и -t могут изменить значение по умолчанию; документ, на который вы ссылаетесь, содержит длинную головную боль -, вызывающую обсуждение деталей указания разделителей полей в зависимости от локали и тому подобного.

Вы спрашиваете: «Что такое F для размера файла или времени последнего изменения?». sortне имеет понятия размера файла или времени модификации. Поскольку ваша цель — отфильтровать вывод du, запустите команду duи подсчитайте поля.

Например, когда я запускаю duбез опций, я получаю два поля на строку, размер и имя файла/каталога:

$ du. 
8      ./ruby
4      ./nextcloud/data/nextcloud
12     ./nextcloud/data/database/nextcloud
4      ./nextcloud/data/database/performance_schema
4      ./nextcloud/data/database/mysql
... etc...

Если вам нужно отсортировать файлы и каталоги в текущем каталоге, du. | sort -nподойдет, потому что sortпо умолчанию сортирует по первому полю. Параметр -n необходим для сортировки по цифрам, а не по буквам:

$ du. | sort -n 
4      ./bitwarden/data/icon_cache
4      ./.cache/obexd
4      ./.cache/pip/wheels/2c/4a/61/5599631c1554768c6290b08c02c72d7317910374ca602ff1e5
4      ./.cache/pip/wheels/33/56/20/ebe49a5c612fffe1c5a632146b16596f9e64676768661e4e46
4      ./.cache/pip/wheels/88/a7/30/e39a54a87bcbe25308fa3ca64e8ddc75d9b3e5afa21ee32d57
4      ./.cache/pip/wheels/fc/a8/66/24d655233c757e178d45dea2de22a04c6d92766abfb741129a
... etc...

Вы можете добавить -r, чтобы сначала отображались большие файлы.

Для сортировки по пути:

du. | sort -k 2

У меня нет быстрого решения для сортировки по имени файла, то есть по последнему компоненту пути. Я думаю, что один sortне может этого сделать, потому что вам нужно будет выяснить, какое подполе является именем файла, а номер подполя варьируется. Вот частичное решение (оно работает только для путей, содержащих косую черту):

$ du. | sed 's|\(.*\)/\(.*\)|\1/\2 \2|' | sort -k3
5639116.
12     ./.cache/pip/http/9/8/7/0 0
12     ./.cache/pip/http/9/c/b/c/0 0
12     ./.cache/pip/http/c/0/4/0/0 0
12     ./.cache/pip/http/f/0/3/0 0
12     ./.cache/pip/http/f/e/d/0 0
136    ./.cache/pip/http/4/8/d/7/0 0
164    ./.cache/pip/http/a/0 0
16     ./.cache/pip/http/0/0/9/7/0 0
16     ./.cache/pip/http/2/8/0 0
... etc...

Я не знаю, есть ли какие-либо комбинации параметров, которые заставляют команду duпечатать измененное время. Если есть, дайте мне знать, и я укажу, что это за поле.

2
28.04.2021, 22:55

Теги

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