Возможно, из других ответов вы пришли к выводу, что символ >
интерпретируется оболочкой, прежде чем find получит его в качестве аргумента. Но чтобы ответить на ваше «почему нет», давайте посмотрим на вашу команду:
$ find . -type f -exec cat > out.txt {} \;
Итак, вы даете find
эти аргументы: "." "-type" "f" "-exec" "cat"
вы даете перенаправлению эти аргументы: "out.txt" "{}"
и ";"
. Это сбивает с толку find
, не заканчивая аргументы -exec
точкой с запятой и не используя имя файла в качестве аргумента ("{}"), это также может сбить с толку перенаправление.
Глядя на другие предложения, вам действительно следует избегать создания выходных данных в том же каталоге, в котором вы находите. Но они будут работать с учетом этого. И комбинация -print0 | xargs -0
очень полезна. То, что вы хотели напечатать, было, вероятно, больше похоже на:
$ find . -type f -exec cat \{} \; > /tmp/out.txt
Теперь, если у вас действительно есть только один уровень подкаталогов и только обычные файлы, вы можете сделать что-то глупое и простое, как это:
cat `ls -p|sed 's/\/$/\/*/'` > /tmp/out.txt
, который получает ls
, чтобы перечислить все ваши файлы и каталоги, добавляя '/'
к каталогам, тогда как sed
добавит '*'
к каталогам. Затем оболочка интерпретирует этот список и расширит глобусы. Предполагая, что это не приведет к слишком большому количеству файлов для обработки оболочкой, все они будут переданы в качестве аргументов cat, а выходные данные будут записаны в out.txt.