Чтобы немного расширить этот ответ, в Linux подстановочные знаки расширяются оболочкой, что означает, что оболочка будет вызывать команду со списком совпадающих имен файлов в качестве аргументов. И оболочка только ищет в текущем каталоге соответствующие файлы (или в любом другом каталоге, указанном вами до подстановочного знака). Например, такая команда как:
ls *.zip
будет фактически переводить на:
ls file1.zip file2.zip file3.zip
И, если в текущем каталоге нет файлов .zip
, буквальное имя файла *.zip
передается команде, и в этом случае он не штрафует файл с именем *.zip
. (A *
является допустимым символом в имени файла Unix/Linux, кстати). Теперь, если вы не хотите, чтобы оболочка расширяла подстановочные знаки, но вместо этого, если вы хотите, чтобы подстановочный знак передавался непосредственно в вызываемую вами команду, вам придется заключить его в кавычки. Это имеет интересный эффект в том, что такие команды как:
find . -name *.zip
даст ожидаемые результаты, если в вашем текущем каталоге нет файлов .zip
(команда find видит *.zip
). Но если у вас есть один или несколько файлов .zip
в текущем каталоге, то выполняется:
find . -name file1.zip file2.zip
который не найдет совпадений ни в каких подкаталогах (если только они не имеют точного имени file1.zip
или file2.zip
и т. д.). Таким образом, мораль этой истории заключается в том, что при использовании find обязательно используйте кавычки вокруг любого имени файла с подстановочными знаками.