Разница между точкой и звездочкой в ​​команде find

У меня есть NAS Synology, который использует под Linux Linux для своей ОС. Используя команду find , я пытаюсь перечислить файлы, измененные с примерно 25 дней, с некоторыми исключениями, в пределах определенного каталога.

Я заметил, что когда я использую «*» вместо «.». после find результат кажется другим. См. Следующие команды:

 find . ! -path "*@eaDir*" -type f ! -iname ".DS_Store" ! -iname "Thumbs.db" -mtime -25 find * ! -path "*@eaDir*" -type f ! -iname ".DS_Store" ! -iname "Thumbs.db" -mtime -25 

Когда я использовал «.», Я получаю некоторый результат через довольно долгое время. Когда я заменил "." «*», я начал получать больше результатов очень быстро, и они были разными, чем при использовании «.».

Я использовал ls -al чтобы проверить, правильны ли результаты при использовании «*», то есть, были ли измененные дата / время файлов в течение последних 25 дней, и действительно, это было так.

Может ли кто-нибудь сказать мне, почему результаты разные?

2 Solutions collect form web for “Разница между точкой и звездочкой в ​​команде find”

Точка обозначает текущий каталог. Обычно это используется как начальный PATH для find .

Незакрашенная звездочка будет расширена оболочкой, прежде чем find в содержимое текущего каталога. Это называется «глотание». Чтобы увидеть эффект, выполните следующие действия:

 echo * 

Несомненно, find * ... не то, что вы хотите использовать.

В:

 find * ... 

как командная строка оболочки, * – это glob, который расширяется оболочкой в ​​(лексически отсортированный) список не скрытых записей в текущем каталоге (с некоторыми оболочками, это будут только записи, содержащие только допустимые символы как * поскольку шаблон имеет значение 0 или более символов ).

Итак, если текущий каталог содержит эти записи:

  • .
  • ..
  • .htaccess
  • file.txt
  • -foo-

find будет вызываться с этими аргументами: find , -foo- , file.txt... ). find скорее всего будет жаловаться на это -foo- – это недопустимый вариант или предикат.

Даже если вы используете:

 find -- * ... 

Это не будет работать правильно для файлов с именем -anything или ! или ( … as -- только говорит find чтобы перестать искать варианты (например, -L , -H ), а не для предикатов.

Вы можете использовать:

 find ./* ... 

чтобы избежать проблем, но опять же, что бы опустить скрытые файлы, можно было опустить файлы с недопустимыми символами или сломать (с слишком длинным списком arg ), если в текущем каталоге много файлов.

С:

 find . ... 

Вы только проходите . find . . это текущий каталог. Тогда он find , а не оболочку, которая будет искать файлы там (включает в себя на глубине 0 все записи, кроме . И .. (другие скрытые записи включены) на глубину 1, и все остальные записи для подкаталогов (все еще исключая . И .. ) рекурсивно.

Вы хотите использовать только:

 find ./* ... 

Если вы хотите, чтобы список файлов на глубине 1 (и только глубину 1) сортировался и хотел исключить скрытые файлы на глубину 1 (и снова только на глубину 1). Это было бы очень маловероятно.

Если вы хотите исключить скрытые файлы, добавьте ! -name '.*' ! -name '.*' Or -name '[!.]*' (хотя остерегайтесь имен файлов с недопустимыми символами, и это также относится к каталогу верхнего уровня, заданному для find который соответствует этому шаблону).

Если вы хотите сортировать на каждом уровне, вы, вероятно, захотите прибегнуть к zsh и его рекурсивному глобую с квалификаторами glob.

Причина, по которой вы получаете разные результаты, – это, скорее всего, то, что в find * поиск начинается с поиска (сказывается, чтобы посмотреть) в первый файл или каталог в текущем каталоге в алфавитном порядке и с помощью find . , он смотрит . сам, но затем следующий первый файл или каталог там в другом порядке (может быть порядок, в котором записи хранятся в каталоге, но некоторые реализации find также сортируют список по номеру inode как попытку минимизировать запросы на головку диска).

Кстати, лучший способ написать свою команду, вероятно, будет:

 find . \( -name @eaDir -o -iname .DS_Store -o -iname Thumbs.db \) \ -prune -o -mtime -25 -type f -print 

Это говорит, что find игнорировать эти каталоги и их содержание вообще (даже не пытаться заглянуть внутрь них).

Interesting Posts
Linux и Unix - лучшая ОС в мире.