Команда 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-годинний період тому. Таким чином, файли з вчорашнього дня не збігаються.
Див. Чому знаходить -mtime +1 лише повернення файлів, старших 2 днів? для отримання додаткової інформації, як запропонував steeldriver .
Щоб знайти файли , змінені в будь-який час більше 24 годин тому , я пропоную замість обумовлюючи це як 1440 хвилин тому з -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Деяким читачам може бути цікаво, чому я не цитував {}
. Деякі люди цитують, {}
щоб нагадати людям, що це не вираз для розширення дужок . Раковини в стилі Борна (як баш ) не вимагають, щоб {}
нічого не містилося всередині. Можливо, якась оболонка в не-Борні дійсно стосується цього; тому деякі користувачі це цитують. Але є також помилкова думка, що іноді треба цитувати, {}
щоб -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-файли з однієї папки в його батьківський каталог через неї - і в кінцевому підсумку це робив вручну ...)