Я предполагаю, что вы уверены, что ни одно из ваших имен файлов не содержит символов новой строки или что у вас есть какой-то способ справиться с этой возможностью.
Во-первых, управляйте именами файлов с помощью sed:
% command_to_list_filenames | sed 's/.*\.\([0-9][0-9][0-9][0-9]\)\..*/\1.&/'
2001.Could Be A Title.2001.prop.ext1
1989.Another Potential Title.1989.prop.ext2
%
Команда s (заменитель) в команде sed обрабатывает каждую строку как последовательность следующего:
- Любое число любого символа (
.*),
- Фактический период (
\.),
- Четыре цифры (
[0-9][0-9][0-9][0-9]),
- Еще один фактический период (
\.) И
- Другая последовательность символов (
.*)
Обратите внимание, что год ([0-9][0-9][0-9][0-9]) заключен между \( и \) , образуя группу.
Затем команда замены заменяет строку на
- Сгруппированные символы, т. Е. Год (
\1),
- Точка (
.) И
- Вся строка ввода (
&).
Тогда нужно просто отсортировать строки по году (который теперь появляется в начале строки) и удалить год:
% command_to_list_filenames | sed 's/.*\.\([0-9][0-9][0-9][0-9]\)\..*/\1.&/' | sort
1989.Another Potential Title.1989.prop.ext2
2001.Could Be A Title.2001.prop.ext1
% command_to_list_filenames | sed 's/.*\.\([0-9][0-9][0-9][0-9]\)\..*/\1.&/' | sort |
sed 's/^[0-9][0-9][0-9][0-9].//'
Another Potential Title.1989.prop.ext2
Could Be A Title.2001.prop.ext1
%
Команда sed может быть тривиально изменена для обработки другого шаблона.
И sed может принимать входные данные из файла вместо канала:
% sed 's/.*(\([0-9][0-9][0-9][0-9]\)).*/\1.&/' list_of_directory_names | sort |
sed 's/^[0-9][0-9][0-9][0-9].//'
Charlie Fisher's (1989)
Badger Bodger (2001)
%
Обратите внимание, что это прекрасно работает с текстом, который содержит точки или скобки, например,
Dr. Strangelove.1964.foo
Mrs. Doubtfire.1993.bar
до тех пор, пока за ними не следуют четырехзначные числа.
Вы можете оставить второй .* Если хотите:
% command_to_list_filenames | sed 's/.*\.\([0-9][0-9][0-9][0-9]\)\./\1.&/'
2001.Could Be A Title.2001.prop.ext1
1989.Another Potential Title.1989.prop.ext2
%