Я хочу перечислить все файлы журнала, которые не принадлежат сегодня, и только те файлы, которые содержатся 2015
в их именах.
Это команды, которые я пробовал:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
Вывод из обоих ничего, но, тем не менее, файлы есть. Что-то не так с этими командами, и я не понимаю, что. Любая помощь будет оценена.
command-line
find
rɑːdʒɑ
источник
источник
find
Часть выглядит хорошо для меня, но я также имел проблемы с-exec
параметром. Я не мог заставить это работать тоже. (Я пытался переместить все файлы jpg из одной папки в родительский каталог через нее - и в итоге я сделал это вручную ...)2015
их именем (другой очевидный недостаток в написании команды), я подозреваю, что будет какой- то вывод. Так что вы можете опубликовать ответ об этом.Ответы:
Команда
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*'
, потому что:\
может затруднить понимание того, что именно передает оболочка вfind
команду."
иногда включает в себя несколько сложных правил .Но в этом случае это не имеет значения.
'
и"
оба обрабатывают*
одно и то же, и выражение недостаточно сложное для\
цитирования, чтобы его было трудно понять.2.
-mtime +1
только выбирает файлы, измененные два или более дней назад.Как
man find
говорит:Предположим, файл был изменен 47 часов назад. Для того, чтобы выяснить , сколько 24-часовые периоды , то есть
find
раунды вниз : это один 24-часовой период назад. Но-mtime +1
подходит только для файлов, время модификации которых строго больше 24 часов назад. Таким образом, файлы со вчерашнего дня не совпадают.См. Почему find -mtime +1 возвращает только файлы старше 2 дней? для получения дополнительной информации, как предложено Steeldriver .
Чтобы найти файлы , измененные в любое время более 24 часов назад , я предлагаю вместо оговаривая это как 1440 минут назад с
-mmin +1440
:Некоторым читателям может быть интересно, почему я не цитирую
{}
. Некоторые люди цитируют,{}
чтобы напомнить людям, что это не выражение для расширения скобки . Оболочки в стиле Bourne (например, bash ) не требуют, чтобы{}
внутри них было что-либо цитироваться. Может быть, какая-то оболочка не в стиле Борна обрабатывает это специально; возможно, поэтому некоторые пользователи цитируют его. Но есть также заблуждение, что иногда нужно заключать в кавычки,{}
чтобы-exec
правильно обрабатывать имена файлов с пробелами. Это, с ложным: с{}
или'{}'
,find
получает те же аргументы, как оболочка удаляет кавычки перед переходом'{}'
кfind
, Чтобы противостоять этому заблуждению, я не цитирую{}
, но это вопрос стиля - если вы предпочитаете{}
документировать, как оболочка не обрабатывается{
и}
особенно, это нормально.Я рекомендую вам также либо изменить
ls
команду, или (как Muru предложил ) заменить егоfind
«S-ls
действия.ls -ltrh
вероятно , не делать то , что вы собираетесь , так как он выполняется отдельно для каждого найденного файла и , следовательно,-t
и-r
флаги, которые определяют сортировку, не имеют никакого отношения.Хотя вывод будет отформатирован немного иначе, чем с
ls -l
использованием, использовать-ls
проще и проще.Или, если вы решите, что вам действительно нужно только перечислить имена файлов (включая их пути, относительно
.
), вы можете просто указать бездействие, вызывая-print
действие по умолчанию :источник
newerXY
синтаксис, который принимает аргументы календаря, например,-newermt 'yesterday'
и! -newermt 'yesterday'
Процитируйте выражение, и я предлагаю вам также заключить в скобки
или
вам не нужно передавать найденные файлы в ls
источник
-type f
? И еслиls
нужно использовать, предложите использовать-ls
.В zsh вы можете использовать глобальные квалификаторы (это уникальная функция zsh, недоступная в других оболочках, таких как bash).
Это только список файлов в текущем каталоге; для рекурсивного обхода каталогов используйте
С
find
,-name 2015
только находит файлы, чье имя точно2015
.-name *2015*
работает только в том случае, если нет файлов, чье имя содержится2015
в текущем каталоге, потому что оболочка расширяет шаблон*2015*
передfind
вызовом. Вам нужно процитировать шаблон:Обратите внимание, что оба
find -mtime +1
и zsh*(m+1)
находят файлы, возраст которых не менее 48 часов , а не файлы старше, чем сегодня. Знак плюс означает «строго больше чем», а количество дней округляется в меньшую сторону. Чтобы найти файлы, которым не менее 24 часов, используйте-mtime +0
или(m+0)
.Если вы хотите найти файлы, которые были последний раз изменены вчера или ранее , вы можете использовать
find
с-newermt
предикатом :Там действительно нет удобного способа сделать этот тест в Zsh.
источник