Сортировка файлов по времени

У меня есть требование идентифицировать разрыв последовательности в наборе файлов. Последовательность начинается с FILENAME_0001 и заканчивается на FILENAME_9999. После этого последовательность перезапускается с 0001.

Для правильной проверки последовательности я использовал ls -rt для выбора файлов в порядке изменения времени и по сравнению с порядковым номером предыдущих файлов. Если предыдущий файл был 9999, я проверяю, будет ли следующий 0001 (для обеспечения смены последовательности).

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

FILENAME_0001 FILENAME_0002 FILENAME_0005 FILENAME_0003 FILENAME_0004 FILENAME_0006 FILENAME_0007 

Это связано с тем, что файлы 3, 4 и 5 имели такое же измененное время, что и второе. Только миллисекунда была другой. Поэтому я предполагаю, что ls -rt учитывает только до секунд. Может ли кто-нибудь предложить обходное решение?

Если ваша find имеет printf , распечатайте mtime в секундах, за которой следует имя файла, затем используйте sort и, наконец, cut :

 find . -type f -printf "%T@\t%f\n" | sort -k 1n -k 2 | cut -f 2- 

Находка выводит TIMESTAMP FILENAME на каждую строку. Сортировка сначала сортирует временные метки в числовом порядке. Если отметки времени равны, он будет использовать имя файла в качестве последнего средства. Вырез удаляет метку времени с выхода.

EDIT: ваше решение perl работает, но я бы сделал это по-другому. Вот простейший:

 find . -type f -print | perl -lne 'print (((stat($_))[9]."\t".$_)' | sort -k 1n -k 2 | cut -f 2- 

Нет необходимости преобразовывать время в строку и обратно. Просто выведите stat mtime как числовое значение, как find.

Наконец, он работал. Я использовал приведенный ниже код:

 for FILENAME in $(ls...); do FILE_TIME=$(perl -e '@d=localtime ((stat(shift))[9]); printf "%4d%02d%02d%02d%02d%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]' $FILENAME) echo "$FILE_TIME $FILENAME" done | sort -k 1n -k 2 | cut -d" " -f2 

Я использую систему HP-UX.