перечислите все файлы, более новые, чем данная метка времени, и отсортируйте их

после нескольких попыток я имею ниже команды.

crontab -l |sed -e '/#/d'|wc -l

больше на sed

больше на туалете

8
12.02.2013, 03:08
2 ответа

find поддержки много форматов ввода даты. Самым простым форматом для получения является YYYYMMDD HH:MM:SS. У Вас уже есть цифры в правильном порядке, все, что необходимо сделать, извлечь первую группу (${timestamp%??????}: возьмите все кроме последних 6 символов; ${timestamp#????????}: возьмите все кроме первых 8 символов), и продолжайте идти, добавляя пунктуацию затем следующая группа, как Вы продвигаетесь.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

В ударе (и ksh и zsh), но не в пепле, можно использовать более читаемое ${STRING_VARIABLE:OFFSET:LENGTH} создать.

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

В файлы вида по дате, распечатайте имена файлов, которым предшествуют даты и вид что, затем разделите префикс даты. Использовать -printf управлять выходным форматом. %TX печатает часть времени изменения, определенного X; если X @, Вы получаете число секунд с эпохи Unix. Ниже я печатаю три разделенных от вкладки столбца: время в поддающемся сортировке формате, имени файла, и время в человекочитаемом формате; cut -f 2- удаляет первый столбец и вызов к expand заменяет вкладку достаточным количеством пробелов для размещения всех ожидаемых имен файлов (корректируйтесь 40, как желаемый). Этот код предполагает, что у Вас нет новых строк или вкладок в именах файлов.

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40
10
27.01.2020, 20:10
  • 1
    только часть находки find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n' дает мне забавный вывод -rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM –  Radek 12.02.2013, 03:25
  • 2
    @Radek Извините, это %T для mtime, %M полномочия. –  Gilles 'SO- stop being evil' 12.02.2013, 03:29
  • 3
    Красивый. Работы гладко. Мой заключительный код find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2- Я разделил имя файла и время - потому что я получу вывод в php и использовании - как разделитель. Огромное спасибо. –  Radek 12.02.2013, 03:37
  • 4
    @Gilles это является потрясающим, но если Вы объясняете timestring, он поможет больше.. –  Rahul Patil 12.02.2013, 05:37
  • 5
    @RahulPatil Сделан. Я также добавил более читаемый метод удара. умная мысль –  Gilles 'SO- stop being evil' 12.02.2013, 12:32

С zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

newer функция возвращает true для файлов, более новых, чем $timestamp (отметьте это zsh zstat не поддерживает подвторую точность хотя).

Затем все, что мы делаем, использовать zsh спецификаторы globbing: D включать точечные файлы, . только рассматривать регулярные файлы, Om заказать на времени изменения, и +newer звонить newer функция для определения, который файл выбрать.

Если Вы хотите отобразить метки времени файла также, можно измениться newer кому:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Отметьте, хотя это, результат поколения имени файла будет включать метки времени, что означает Вас, не может использовать метки времени больше как имена файлов.

5
27.01.2020, 20:10
  • 1
    это не будет работать ssh, например. –  evandrix 26.01.2016, 17:33

Теги

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