2

Я пытаюсь найти файлы, которые соответствуют time=* а затем нужно отобразить его, отсортировав по числовому признаку.
Имена файлов результатов будут такими:

first/path/time=001.jpg
first/path/time=002.jpg
second/path/time=001.jpg
...

который я хочу видеть как,

first/path/time=001.jpg
second/path/time=001.jpg
first/path/time=002.jpg
...

отсортировано по количеству по 3 цифрам в имени файла.

На данный момент я попытался find . -name time=* | rev | sort | rev

который работает для однозначных цифр, но с номерами, такими как 019 021 , не работает.

Полный путь будет что-то вроде

path/to/folder1/alpha=0.1_beta=0.2_gamma=1.0/time=001.jpg
path/to/folder1/alpha=0.1_beta=0.2_gamma=0.1/time=001.jpg
path/to/folder2/alpha=0.1_beta=0.2_gamma=0.1/time=001.jpg
.
.
.

Я думаю, что было бы проще, если бы файлы могли быть отсортированы, используя только последние 7 символов. 001.jpg 010.jpg ... однако, к сожалению, sort не поддерживает отрицательную индексацию для получения последних 6 символов :(

3 ответа3

2

Это должно сделать:

find . -name 'time=*' | sort -t= -k3

Но это более безопасная сортировка, согласно комментарию Камиля Мачоровского:

perl -C -F= -wnle 'push @a,[$_,split(/\./,$F[-1])]; END {$,="\n"; print map{$$_[0]} sort{$$a[1]<=>$$b[1]} @a}'

Используйте его в конвейере после find вместо sort в первом.

2

Предполагая, что ни один путь не является достаточно безумным, чтобы требовать find ... -print0:

find . -type f -name "time=*" | awk -F '=' '{ print $NF "=" $0 }' | sort -n | cut -d "=" -f 2-

Я использовал awk для извлечения частей за последним = , он выводит полные строки с дополнительной соответствующей частью впереди, разделяя дополнительным = . Например:

001.jpg=path/to/folder1/alpha=0.1_beta=0.2_gamma=1.0/time=001.jpg

Они отсортированы численно с помощью sort . Затем cut части экстрактов после этого дополнительного (сначала) = ; это оригинальные пути.

Создано ровно четыре процесса: find , awk , sort , cut . Альтернативы, использующие синтаксис find ... -exec some_tool ... \; создайте один процесс some_tool для соответствующего файла.

1

Quickie с остатками я выбрал из командной строки :-)

find . -name time="*" -exec ruby -e "s='{}'; puts s.split('=')[-1].split('.')[0]+s" \; |
sort -n | colrm 1 3

Объяснение:

Мой друг Ruby хранит строку пути, заданную find как {} и сохраняет ее в переменной s . Затем она разбивает строку по символам = и сохраняет последнюю часть (индекс -1 в массиве результатов), например, 002.jpg . Затем она разбивает эту строку на . символов и сохраняет первую часть (индекс 0 в массиве результатов), предполагая, что файлы имеют имя ddd.<ext> , результатом чего является трехзначное число, например 002 .

Наконец она печатает это и добавляет исходную строку пути. Это дало бы:

002./alpha=0.1_beta=0.2_gamma=1.0/path/time=002.jpg
001./alpha=0.1_beta=0.2_gamma=1.0/path/time=001.jpg
021./alpha=0.1_beta=0.2_gamma=0.1/path/time=021.jpg
001./alpha=0.1_beta=0.2_gamma=0.1/path/time=001.jpg
019./alpha=0.1_beta=0.2_gamma=0.1/path/time=019.jpg

Дополнительные команды конвейера сортируют выходные данные численно (sort -n) и, наконец, удаляют первые три столбца выходных данных (colrm 1 3).

Пример:

test$ find . -name time="*" -exec ruby -e "s='{}'; puts s.split('=')[-1].split('.')[0]+s" \; 
| sort -n | colrm 1 3
./alpha=0.1_beta=0.2_gamma=0.1/path/time=001.jpg
./alpha=0.1_beta=0.2_gamma=1.0/path/time=001.jpg
./alpha=0.1_beta=0.2_gamma=1.0/path/time=002.jpg
./alpha=0.1_beta=0.2_gamma=0.1/path/time=019.jpg
./alpha=0.1_beta=0.2_gamma=0.1/path/time=021.jpg

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .