В синхронном программировании монитор может рассматриваться как блок или, более конкретно, блок управления (для внесения каких-либо изменений в объект) с пространством только одного потока в любой данный момент. Таким образом, нескольким потокам можно запретить одновременную запись одного объекта и защиту объекта от повреждения. В нем метод wait () сообщает потоку, если какой-либо другой поток уже находится на мониторе, и, если это так, сообщает вызывающему потоку WAIT для выхода другого потока. Или, технически, сообщает вызывающему потоку SLEEP, пока не получит уведомление.
Он останавливает любое дальнейшее выполнение кода в вызывающем потоке, в отличие от бесконечного цикла, в котором выполнение продолжается, но никакого кода после цикла не выполняется, пока цикл не прервется.
находка - исполнительный аргумент выполняет команду, которую Вы указываете однажды для каждого файла, который это находит. Попробуйте:
$ find . -type f -exec cat {} \; > out.txt
или:
$ find . -type f | xargs cat > out.txt
xargs преобразовывает свой стандартный вход в параметры командной строки для команды, которую Вы указываете. Если Вы волнуетесь по поводу встроенных пробелов в именах файлов, попробуйте:
$ find . -type f -print0 | xargs -0 cat > out.txt
Вы могли сделать что-то вроде этого:
$ cat `find . -type f` > out.txt
Хм... найдите, кажется, рекурсивно вызывает, поскольку Вы производите out.txt к текущему каталогу
Попробуйте что-то как
find . -type f -exec cat {} \; > ../out.txt
Как насчет того, чтобы просто перенаправить вывод находки в файл, так как все, что Вы желаете сделать, является кошкой все файлы в один большой файл:
find . -type f -exec cat {} \; > /tmp/out.txt
Возможно, Вы вывели из других ответов что >
символ интерпретируется оболочкой, прежде чем найдут, получает его как аргумент. Но ответить Ваш, "почему не" позволяет взгляду на Вашу команду, которая является:
$ 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
добавит a '*'
к каталогам. Оболочка затем интерпретирует этот список и развернет шарики. Принятие этого не приводит к слишком многим файлам для оболочки для обработки, они будут все переданы как аргументы кошке, и вывод будет записан в out.txt.
Попробуйте это:
(find . -type f -exec cat {} \;) > out.txt
Или просто не учтите находку, которая бесполезна, если Вы используете действительно большую оболочку Z (zsh
), и можно сделать это:
setopt extendedglob
(это должно быть в Вашем .zshrc
) Затем:
cat **/*(.) > outfile
просто работы :-)
В ударе Вы могли сделать
cat $(find . -type f) > out.txt
с $ () можно получить вывод от команды и передать его другому