Я хочу перечислить все файлы журнала, которые не принадлежат сегодня и только файлы, которые содержат 2015
на их имена.
Это команды, которые я попробовал:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
Вывод от обоих - ничто, но тем не менее, файлы там. Что-то неправильно с этими командами, и я не добираюсь что. Любая справка ценилась бы.
Команда find . -name '*2015*' -mmin +1440 -ls
вероятно, сделает то, что Вы хотите. Посмотрите ниже для деталей.
Ваша первая команда имела -name 2015
. Это не работало, потому что это находит только файлы, имена которых точно 2015
, без других символов в них.
Ваша вторая команда, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
, возможно, перестал работать по нескольким причинам:
*
символы расширены оболочкой, затем перешли к 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*'
, потому что:
\
может мешать видеть точно, что передается оболочкой find
команда."
иногда включает несколько сложные правила.Но в этом случае это действительно не имеет значения. '
и "
обе обработки *
то же и выражение не являются сложными достаточно для \
заключение в кавычки, чтобы мешать понимать.
-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
Заключите выражение в кавычки, и я предлагаю, чтобы Вы заключили скобки в кавычки также
find . -name "2015" -mtime +1 -exec ls -ltrh '{}' \;
или
find . -name "*2015*" -mtime +1 -exec ls -ltrh '{}' \;
Вы не должны передавать файлы, которые Вы находите к ls
find . -name "*2015*" -mtime +1
В 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.