Как сортировать файлы по нескольким частям имени файла?

Пакеты, имена которых содержат i386, по всей вероятности, потребуют ручной обработки. Могут быть соответствующие пакеты с amd64в их имени, , например. пакеты ядра; они были бы уместны в этом случае. У других не будет прямых эквивалентов, например.ia32-libs-i386и должны быть соответствующим образом обработаны с использованием нескольких -арок (, если они все еще необходимы ).

Пакеты, перечисленные как :i386(, обратите внимание на двоеточие ), являются многоархивными пакетами -и в большинстве случаев должны быть заменены соответствующим вариантом :amd64.

1
02.07.2019, 07:37
1 ответ

Подводя итог, с _в качестве разделителя полей вы хотите отсортировать числа во втором и шестом полях. В этом случае, и если имена файлов находятся в файле с именем filenames, по одному файлу в строке, используйте:

$ sort -nt_ -k2,2 -k6,6 filenames
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

Если файлы находятся в текущем каталоге, решение POSIX:

$ find. -maxdepth 1 -type f -name '*.dat' | sort -nt_ -k2,2 -k6,6
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

Как это работает

  • -nсообщает sortо численной сортировке.

  • -t_указывает sortиспользовать _в качестве разделителя полей.

  • -k2,2 -k6,6указывает sortсначала сортировать по второму полю и, если вторые поля равны, то сортировать по шестому полю.

Решение GNU (обрабатывает имена файлов, содержащие символы новой строки)

Для обработки имен файлов, которые сами содержат символы новой строки, необходимо использовать разделение NUL -. Это означает использование -print0с findи -zс sort, а затем, чтобы вывести вывод для печати для отображения здесь, преобразование NUL в новые строки сtr:

$ find. -maxdepth 1 -type f -name '*.dat' -print0 | sort -znt_ -k2,2 -k6,6 | tr '\0' '\n'
./Tmp1_24298_Data_545_547_63359_Sample.dat
./Tmp1_24298_Data_701_703_63437_Sample.dat
./Tmp1_24298_Data_683_685_63517_Sample.dat
./Tmp1_24298_Data_695_697_63557_Sample.dat
./Tmp1_24298_Data_667_669_63637_Sample.dat
./Tmp1_28703_Data_545_547_63833_Sample.dat
./Tmp2_28703_Data_701_703_63910_Sample.dat
./Tmp2_28703_Data_683_685_63951_Sample.dat
./Tmp2_28703_Data_695_697_64031_Sample.dat
./Tmp1_28703_Data_667_669_64111_Sample.dat
./Tmp2_28707_Data_545_547_64306_Sample.dat
./Tmp2_28707_Data_701_703_64344_Sample.dat
./Tmp2_28707_Data_683_685_64424_Sample.dat
./Tmp2_28707_Data_295_697_64505_Sample.dat
./Tmp2_28707_Data_667_669_64545_Sample.dat
2
27.01.2020, 23:30

Теги

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