ls *.txt | xargs cat >> all.txt
может работать немного лучше, так как он будет добавлять в all.txt вместо того, чтобы создавать его снова после каждого файла.
Кстати, cat *.txt >all.txt
тоже будет работать. :-)
Почему это не работает?
ls *.txt | xargs cat > all.txt
(Я хочу объединить содержимое всех текстовых файлов в один файл 'all.txt'.) Найти с помощью -exec также должно работать, но мне бы очень хотелось понять синтаксис xargs.
Спасибо
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
).
You could also come across a command line length limitation. Part of the reason for using xargs
is that it splits up the input into safe command-line-sized chunks. So, imagine a situation in which you have hundreds of thousands of .txt files in the directory. ls *.txt
will fail. You would need to do
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
in this case is a regular expression matching everything that ends in .txt (so it's not exactly like *.txt
, since if you have a file called atxt
, then *.txt
would not match it, but the regular expression would.)
The use of another path is because, as other answers have pointed out, all.txt is matched by the pattern *.txt
so there would be a conflict between input and output.
Note that if you have any files with '
in their names (and this may be the cause of the unmatched single quote
error), you would want to do
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
The --null option tells grep to use output separated by a \0
(aka null) character instead of the default newline, and the -0
option to `xargs tells it to expect its input in the same format. This would work even if you had file names with newlines in them.