Ответы:
ls *.txt | xargs cat >> all.txt
может работать немного лучше, так как он будет добавлять в all.txt вместо того, чтобы создавать его снова после каждого файла.
Кстати, cat *.txt >all.txt
тоже будет работать. :-)
Если некоторые из ваших имен файлов содержат ', "или пробел не xargs
будет выполнен из-за проблемы с разделителем
В общем, никогда xargs
не бегайте без -0, так как он вернется и укусит вас однажды.
Попробуйте вместо этого использовать GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
или если вы предпочитаете:
ls *.txt | parallel cat >> tmp/all.txt
Узнайте больше о GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt
это файл в том же каталоге, поэтому cat запутывается, когда хочет записать из того же файла в тот же файл.
С другой стороны:
ls *.txt | xargs cat > tmp/all.txt
Это будет читать из текстовых файлов в вашем текущем каталоге в all.txt в подкаталоге (не входит в комплект *.txt
).
Вы также можете столкнуться с ограничением длины командной строки. Одна из причин использования xargs
заключается в том, что он разбивает входные данные на безопасные блоки размером с командную строку. Итак, представьте ситуацию, в которой у вас есть сотни тысяч .txt файлов в каталоге. ls *.txt
не удастся. Вам нужно будет сделать
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
в данном случае это регулярное выражение, совпадающее со всем, что заканчивается в .txt (так что это не совсем так *.txt
, поскольку, если у вас есть файл с именем atxt
, он *.txt
не будет совпадать с ним, но регулярное выражение будет.)
Использование другого пути связано с тем, что, как указали другие ответы, шаблон all.txt соответствует шаблону, *.txt
поэтому между входом и выходом может возникнуть конфликт.
Обратите внимание, что если у вас есть какие-либо файлы с '
их именами (и это может быть причиной unmatched single quote
ошибки), вы можете захотеть сделать
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
Опция --null указывает grep использовать выходные данные, разделенные \0
символом (или нулевым) вместо новой строки по умолчанию, а -0
опция `xargs говорит ему ожидать ввода в том же формате. Это будет работать, даже если у вас есть имена файлов с символами новой строки.
ls
для этого . Если вы действительно не можете использовать,cat *.txt >all.txt
попробуйтеprintf '%s\0' *.txt | xargs -r0 cat >all
и затемmv all all.txt
избегайте ссылки на файл.