У меня есть некоторые каталоги с меткой времени, названные с префиксом, который может варьироваться, и метка времени в удобной форме YYYYMMDD, сопровождаемый переменными суффиксами, которые также обозначают хронологический порядок (не самым нормальным способом). К сожалению, часть заголовка имени может включать _
символ, который используется в качестве разделителя полей.
Например:
/collect/mydir_20161102_0A
/collect/mydir_20161102_0B
/collect/mydir_20161102_0C
/collect/mydir_20161102_1
/collect/mydir_20161102_2
/collect/other_dir_20161103_0A
/collect/other_dir_20161103_0B
/collect/mydir_20161104_0A
/collect/mydir_20161104_0B
/collect/mydir_20161104_0C
/collect/mydir_20161104_1
/collect/mydir_20161104_2
Порядок имен, отображенных здесь, является на самом деле хронологическим порядком создания, включая суффиксы, так, чтобы 0A прибыл, прежде чем 0B, и весь 0s прибывают прежде 1. Не должно быть никакого падения другого префикса заголовка с той же меткой времени.
Каталоги, возможно, были изменены или изменены начиная с создания, таким образом, использование ctime и mtime отсутствует.
Я должен произвести строку, содержащую заголовок и метку времени, с или без предыдущего пути так mydir_20161104
или /collect/mydir_20161104
, но это должно всегда прибывать из нового каталога. Поиск не должен рекурсивно вызывать через уровни каталога.
Я хотел бы постараться не анализировать ls
также!
Не могло бы быть симпатичным, и я не обрабатываю имена файлов с новыми строками в них:
find collect/ -mindepth 1 |
awk -F_ '{print $(NF-1),$NF,$0}' |
sort -V |
sed -r 's/^([^ ]* ){2}//'
Так:
find
_
- разграниченные поля в имени файла к запуску его использование awk
-V
- вид версии - может обработать поля как 0A
и 1
)sed
Это могло быть сделано безопасным для имен файлов, содержащих любой допустимый символ, но я должен буду заменить awk
с sed
для этого.
Мой вывод:
$ find collect/ -mindepth 1 | awk -F_ '{print $(NF-1),$NF,$0}' | sort -V | sed -r 's/^([^ ]* ){2}//'
collect/mydir_20161102_0A
collect/mydir_20161102_0B
collect/mydir_20161102_0C
collect/mydir_20161102_1
collect/mydir_20161102_2
collect/other_dir_20161103_0A
collect/other_dir_20161103_0B
collect/mydir_20161104_0A
collect/mydir_20161104_0B
collect/mydir_20161104_0C
collect/mydir_20161104_1
collect/mydir_20161104_2
Конечно, это просто анализирует ls
. ;)
Если Вы нуждаетесь просто в заголовке и метке времени без суффикса, инвертируете вид (sort -Vr
) и измените последнее sed
кому:
sed -r 's:.*/::;s/_[^_]*$//;q'
Так:
$ find collect/ -mindepth 1 | awk -F_ '{print $(NF-1),$NF,$0}' | sort -rV | sed -r 's:.*/::;s/_[^_]*$//;q'
mydir_20161104
И версия, которая может обработать имена файлов с новыми строками:
find collect/ -mindepth 1 -print0 | sed -rz 's/(.*)(_[^_]*)(_[^_]*)$/\2\3 &/' | sort -zrV | sed -zr 's:.*/::;s/_[^_]*$//;q'
Это использует \0
- разграниченные строки повсюду (-print0
в find
, -z
в sed
и sort
). awk
заменяется эквивалентом sed
команда.