Команда find . -name '*2015*' -mmin +1440 -ls
, вероятно, сделает то, что вы хотите. Смотрите ниже для деталей.
Ваша первая команда имела -name 2015
. Это не сработало, потому что он находит только файлы, чьи имена точно 2015
, без других символов в них.
Ваша вторая команда, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
возможно, потерпела неудачу по нескольким причинам:
1. Символы без кавычек *
расширяются оболочкой, а затем передаются в find
.
Если есть какие-либо файлы, непосредственно содержащиеся в текущем каталоге (тот, в котором вы находились, когда вы запускали эту find ...
команду), чьи имена содержат 2015
(и не начинаются с .
), то оболочка расширяется *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 часов назад. Таким образом, файлы со вчерашнего дня не совпадают.
См. Почему find -mtime +1 возвращает только файлы старше 2 дней? для получения дополнительной информации, как предложено Steeldriver .
Чтобы найти файлы , измененные в любое время более 24 часов назад , я предлагаю вместо оговаривая это как 1440 минут назад с -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Некоторым читателям может быть интересно, почему я не цитирую {}
. Некоторые люди цитируют, {}
чтобы напомнить людям, что это не выражение для расширения скобки . Оболочки в стиле Bourne (например, bash ) не требуют, чтобы {}
внутри них было что-либо цитироваться. Может быть, какая-то оболочка не в стиле Борна обрабатывает это специально; возможно, поэтому некоторые пользователи цитируют его. Но есть также заблуждение, что иногда нужно заключать в кавычки, {}
чтобы -exec
правильно обрабатывать имена файлов с пробелами. Это, с ложным: с {}
или '{}'
, find
получает те же аргументы, как оболочка удаляет кавычки перед переходом '{}'
кfind
, Чтобы противостоять этому заблуждению, я не цитирую {}
, но это вопрос стиля - если вы предпочитаете {}
документировать, как оболочка не обрабатывается {
и }
особенно, это нормально.
Я рекомендую вам также либо изменить ls
команду, или (как Muru предложил ) заменить его find
«S -ls
действия. ls -ltrh
вероятно , не делать то , что вы собираетесь , так как он выполняется отдельно для каждого найденного файла и , следовательно, -t
и -r
флаги, которые определяют сортировку, не имеют никакого отношения.
Хотя вывод будет отформатирован немного иначе, чем с ls -l
использованием, использовать -ls
проще и проще.
find . -name '*2015*' -mmin +1440 -ls
Или, если вы решите, что вам действительно нужно только перечислить имена файлов (включая их пути, относительно .
), вы можете просто указать бездействие, вызывая -print
действие по умолчанию :
find . -name '*2015*' -mmin +1440
find
Часть выглядит хорошо для меня, но я также имел проблемы с-exec
параметром. Я не мог заставить это работать тоже. (Я пытался переместить все файлы jpg из одной папки в родительский каталог через нее - и в итоге я сделал это вручную ...)