Утилита 'find' не выводит все файлы при использовании подстановочных знаков

419
dafnahaktana

Бег:

$find . -name *.exe 

дает:

./MakeItSo_1.2.2/MakeItSo_1.2.2/MakeItSo.exe ./MakeItSo.exe 

но это не единственные исполняемые файлы в каталоге. Например, бег

$find . -name ATLTester.exe 

дает:

./Debug/ATLDmoVexaTester.exe 
3

1 ответ на вопрос

7
Kamil Maciorowski

Это из - за оболочки подстановки . Пытаться:

find . -name "*.exe" 

Когда не заключено в кавычки, *.exeраспространяется на все *.exeфайлы в текущем каталоге, если нет ни одного. Так получилось, что у вас есть только один такой файл, поэтому ваша оригинальная команда была на самом деле:

find . -name MakeItSo.exe 

Если у вас нет *.exeфайлов в текущем каталоге, глобализация оболочки не произойдет, findвы получите *.exeаргумент буквально, и ваша команда будет работать так, как вы ожидали. С другой стороны, если у вас есть более одного файла с этим расширением, все они будут приведены в качестве аргументов, findи это приведет к синтаксической ошибке.

Хорошо подмечено! Я некоторое время ломал голову над вопросом, прежде чем прокрутить до твоего ответа. AFH 7 лет назад 0
@AFH Сравните [этот вопрос] (https://superuser.com/q/1217706/432690) несколько часов назад и мой комментарий там. Сначала я подумал, как «дежа вю?» Вот. Kamil Maciorowski 7 лет назад 0
Спасибо за ссылку: я никогда не замечал опцию `-delete`, поэтому приятно знать, что я никогда не был слишком стар, чтобы учиться. AFH 7 лет назад 0
Но ОП также сказал, что у него `ATLTester.exe` в том же каталоге. Hashim 6 лет назад 0
@Hashim В подкаталоге *. Это имеет огромное значение. Kamil Maciorowski 6 лет назад 1
Ах, хороший улов. Hashim 6 лет назад 0