Если вы просто ищете файлы в одном каталоге, а не во вложенных каталогах, вы можете использовать аргумент glob для вашей команды, который будет интерпретироваться оболочкой и выдавать один аргумент вашей команде длякаждое соответствующее имя файла:
$ echo *.txt
file1.txt file2.txt file3.txt
Если вы ищете файлы, произвольно вложенные глубоко в подкаталоги, find
действительно то, что вы ищете.Вам нужно передать каталог, в котором вы ищите, и использовать параметр -name
с выражением glob в кавычках, чтобы найти соответствующие файлы (если glob не указан в кавычках, оболочка попытается его интерпретировать и подставит списокфайлы, соответствующие этому имени в текущем каталоге, а это не то, что вам нужно):
$ find . -name "*.txt"
file1.txt. file2.txt file3.txt subdir/file.txt
Если вы хотите передать их в качестве аргументов другой функции, вы можете использовать $()
(что эквивалентноболее знакомые обратные кавычки ``
),
echo $(find . -name "*.txt")
Или, если вы собираетесь получить список, который слишком длинен для списка с одним аргументом или вам нужно поддерживать пробелы в имени файла, вы можете использовать xargs
, который делит свой ввод на куски, каждый из которых достаточно мал для передачи в команду.
find . -name "*.txt" | xargs echo
Если ваши имена файлов содержат пробелы, то xargs
будетразделите их на две части, рассматривая каждый как отдельный аргумент, а это не то, что вам нужно.Вы можете избежать этого, используя нулевой символ 0
в качестве разделителя с аргументом -print0
для find
и аргументом -0
для xargs
.
find . -name "*.txt" -print0 | xargs -0 echo