Как перечислить файлы, более старые, чем день с “2 015” в имени файла?

Я хочу перечислить все файлы журнала, которые не принадлежат сегодня и только файлы, которые содержат 2015 на их имена.

Это команды, которые я попробовал:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

Вывод от обоих - ничто, но тем не менее, файлы там. Что-то неправильно с этими командами, и я не добираюсь что. Любая справка ценилась бы.

10
задан 7 April 2015 в 20:37

3 ответа

Команда find . -name '*2015*' -mmin +1440 -ls вероятно, сделает то, что Вы хотите. Посмотрите ниже для деталей.

Ваша первая команда имела -name 2015. Это не работало, потому что это находит только файлы, имена которых точно 2015, без других символов в них.

Ваша вторая команда, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;, возможно, перестал работать по нескольким причинам:

1. Неупомянутый * символы расширены оболочкой, затем перешли к find.

Если существуют какие-либо файлы, непосредственно содержавшиеся в текущем каталоге (тот, Вы находитесь в том, когда Вы выполнили это find ... команда), чьи имена содержат 2015 (и не запускайте с a .), затем расширенная оболочка *2015* в список тех имен файлов, затем передал тот список как аргументы find. Это не то, что Вы хотите - вместо этого, Вы хотите передать *2015* буквально как аргумент для нахождения, так, чтобы find, а не оболочка, может найти, какие файлы соответствуют ей.

Решить ту проблему, кавычку *2015*. Существует три распространенных способа сделать это:

  • '*2015*' (т.е. find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*" (т.е. find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\* (т.е. find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

Я предлагаю писать это с одинарными кавычками как '*2015*', потому что:

Но в этом случае это действительно не имеет значения. ' и " обе обработки * то же и выражение не являются сложными достаточно для \ заключение в кавычки, чтобы мешать понимать.

2. -mtime +1 только выбирает файлы, измененные два или больше дня назад.

Как man find говорит:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

Предположим, что файл был изменен 47 часов назад. Выяснять сколько 24-часовых периодов то есть, find округляет в меньшую сторону: это один 24-часовой период назад. Но -mtime +1 соответствия только регистрируют, чье время изменения строго больше чем один 24-часовой период назад. Таким образом файлы со вчерашнего дня не подобраны.

Посмотрите, Почему действительно находит-mtime +1 только файлы возврата более старый, чем 2 дня? для получения дополнительной информации, как предложено steeldriver.

Для нахождения файлов в последний раз измененными в любое время больше чем 24 часа назад я предлагаю вместо этого предусматривающий это как 1440 минут назад с -mmin +1440:

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

Некоторые читатели могли бы задаваться вопросом, почему я не заключил в кавычки {}. Некоторые люди кавычка {} напомнить людям, что это не выражение для расширения фигурной скобки. Оболочки стиля границы (как удар) не требуют {} ни с чем внутри, чтобы быть заключенным в кавычки. Возможно, некоторая оболочка non-Bourne-style действительно рассматривает его особенно; это могло бы быть то, почему некоторые пользователи заключают его в кавычки. Но существует также неправильное представление, которое нужно иногда заключать в кавычки {} так -exec имена файлов дескрипторов с пробелами правильно. Это; s ложь: с {} или '{}', find получает те же аргументы, как оболочка удаляет кавычки перед передачей '{}' кому: find. Для противостояния этому неправильному представлению я не заключаю в кавычки {}, но это - вопрос стиля - если Вы предпочитаете {} к документу, как оболочка не рассматривает { и } особенно, это прекрасно.

Я рекомендую Вам также любое изменение Ваш ls команда, или (поскольку muru предложил) заменяет его find -ls действие. ls -ltrh вероятно, не делает то, что Вы предназначаете, потому что это выполняется отдельно для каждого найденного файла и таким образом -t и -r флаги, которые указывают сортировку, не важны.

Хотя вывод будет отформатирован немного по-другому, чем с ls -l, использование -ls более просто и легко.

find . -name '*2015*' -mmin +1440 -ls

Или если Вы решаете, что действительно только необходимо перечислить имена файла (включая их пути, относительно .), Вы не можете просто указать действие, вызвав значение по умолчанию -print действие, которое будет использоваться:

find . -name '*2015*' -mmin +1440
18
ответ дан 23 November 2019 в 04:20

Заключите выражение в кавычки, и я предлагаю, чтобы Вы заключили скобки в кавычки также

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

или

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

Вы не должны передавать файлы, которые Вы находите к ls

find . -name "*2015*" -mtime +1
2
ответ дан 23 November 2019 в 04:20

В zsh можно использовать спецификаторы шарика (это - уникальная zsh функция, не доступная в других оболочках, таких как удар).

ls -ltr *2015*(m+1)

Это только перечисляет файлы в текущем каталоге; для пересечения каталогов рекурсивно использовать

ls -ltr **/*2015*(m+1)

С find, -name 2015 только находит файлы, имя которых точно 2015. -name *2015* только работы, при отсутствии файлов, имя которых содержит 2015 в текущем каталоге, потому что оболочка разворачивает шаблон *2015* прежде find вызывается. Необходимо заключить шаблон в кавычки:

find -name '*2015*' -mtime +1 …

Отметьте это оба find -mtime +1 и zsh's *(m+1) найдите файлы, которые составляют по крайней мере 48 старых часов, не файлы, более старые, чем сегодня. Средство знака "плюс" “строго больше, чем” и количество дней округляется в меньшую сторону. Для нахождения файлов, которые составляют по крайней мере 24 старые часа использовать -mtime +0 или (m+0).

Если Вы хотите найти файлы, которые были в последний раз изменены вчера или прежде, можно использовать find с -newermt предикат:

find -name '*2015*' ! -newermt 'today 0:00' …

Нет никакого действительно удобного способа сделать этот тест в zsh.

2
ответ дан 23 November 2019 в 04:20

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

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