Я хочу перечислить все файлы (отсортированные по дате), которые новее, чем отметка времени, в формате только 20130207003851
в каталоге / tmp. Подкаталоги могут быть опущены.
Использование SUSE Linux Enterprise Server 11.
Выходной формат должен быть
S0002948.LOG Feb 7 03:28
S0002935.LOG Feb 7 05:58
S0002952.LOG Feb 7 09:58
S0002940.LOG Feb 7 11:58
find / tmp -newermt "7 февраля 2013" -ls перечисляет файлы, которые я хочу, но
- как я могу использовать метку времени в формате 20130207003851
- как я могу отсортировать вывод?
- как я могу отображать только имя файла и дату. Сначала имя файла, а затем дата?
PS Я не хочу использовать сенсорный, чтобы создать справочный файл для поиска
PSS
find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
shell-script
find
ls
timestamps
Радек
источник
источник
2013007000385
должно представлять? Я думаю, 2013 год - это год, но как пройти007000385
до 7 февраля?20130207003851
. Не правильно скопировал или ... извините за это.Ответы:
find
поддерживает множество форматов ввода даты . Простейший формат для получения - ГГГГММДД ЧЧ: ММ: СС. У вас уже есть цифры в правильном порядке, все, что вам нужно сделать, это извлечь первую группу (${timestamp%??????}
: взять все, кроме последних 6 символов;:${timestamp#????????}
взять все, кроме первых 8 символов), и продолжать, добавляя пунктуацию, затем следующую группу как вы идете вместе.В bash (и ksh и zsh), но не в ash, вы можете использовать более читаемую
${STRING_VARIABLE:OFFSET:LENGTH}
конструкцию.Чтобы отсортировать файлы по дате, распечатайте имена файлов с предшествующими датами и отсортируйте их, а затем удалите префикс даты. Используйте
-printf
для управления форматом вывода. печатает часть времени модификации, определяемого ; если есть , вы получите количество секунд с начала эпохи Unix. Ниже я печатаю три столбца, разделенных табуляцией: время в сортируемом формате, имя файла и время в удобочитаемом формате; удаляет первый столбец, и вызов заменяет вкладку достаточным количеством пробелов, чтобы вместить все ожидаемые имена файлов (настройте 40 по желанию). В этом коде предполагается, что в именах файлов нет новых строк или вкладок.%TX
X
X
@
cut -f 2-
expand
источник
find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'
дает мне забавный вывод-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
%T
для mtime,%M
это разрешения.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 и использовать - как разделитель. Огромное спасибо.С
zsh
:В
newer
функции возвращает истинные файлы новее$timestamp
(обратите внимание , чтоzsh
«szstat
не поддерживают субсекундную точность , хотя).Затем все, что мы делаем, - это используем
zsh
квалификаторы глобинга:D
включать точечные файлы,.
рассматривать только обычные файлы,Om
упорядочивать по времени модификации и+newer
вызыватьnewer
функцию, чтобы определить, какой файл выбрать.Если вы также хотите отобразить временные метки файла, вы можете изменить
newer
на:Обратите внимание, что результат генерации имени файла будет включать метки времени, что означает, что вы больше не можете использовать их в качестве имен файлов.
источник
ssh
, например.