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

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

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

  • запрашивать все символические ссылки в каталоге
  • как найти вхождения файла, используя locate
  • Почему моя находка не рекурсивна?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Поиск файлов и отображение их владельца
  • Как найти список файлов и закрепить их в одном ZIP-файле?
  •  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 дней, и действительно, это было так.

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

  • `find -path` объяснил
  • комбинировать поиск с другими командами: когда использовать -exec и когда использовать трубу?
  • find: ничего не делать, если файлы не указаны
  • Человеко-читаемые файлы с помощью printf
  • Исключить пути, которые заставят find жаловаться на разрешения
  • Что эквивалентно rm `find lib / -name * .swp` без find?
  • 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 игнорировать эти каталоги и их содержание вообще (даже не пытаться заглянуть внутрь них).

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