Как я нахожу новую метку времени в именах каталогов в сценарии удара?

У меня есть некоторые каталоги с меткой времени, названные с префиксом, который может варьироваться, и метка времени в удобной форме 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 также!

2
задан 4 November 2016 в 18:41

1 ответ

Не могло бы быть симпатичным, и я не обрабатываю имена файлов с новыми строками в них:

find collect/ -mindepth 1 | 
  awk -F_ '{print $(NF-1),$NF,$0}' | 
  sort -V | 
  sed -r 's/^([^ ]* ){2}//'

Так:

  1. Список файлов с find
  2. Добавление последних 2 _- разграниченные поля в имени файла к запуску его использование awk
  3. Сортировка его (-V - вид версии - может обработать поля как 0A и 1)
  4. Удаление добавленной части с 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 команда.

3
ответ дан 2 December 2019 в 02:49

Другие вопросы по тегам:

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