Відповіді:
ls *.txt | xargs cat >> all.txt
може працювати трохи краще, оскільки він додасться до all.txt, а не створює його знову після кожного файлу.
До речі, cat *.txt >all.txt
теж би спрацювало. :-)
Якщо деякі ваші імена файлів містять "," або пробіл xargs
не вдасться через проблему з роздільником
Взагалі ніколи не бігайте xargs
без -0, оскільки він повернеться і вкусить вас якийсь день.
Подумайте про використання паралельно GNU:
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
це файл в одному каталозі, тому кішка плутається, коли хоче записати з того самого файлу в той самий файл.
З іншої сторони:
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
символом (aka null) замість нового рядка за замовчуванням, а -0
опція `xargs повідомляє йому очікувати його введення в тому ж форматі. Це спрацює, навіть якщо б у вас були імена файлів з новими рядками.
ls
для цього . Якщо ви дійсно не можете скористатися,cat *.txt >all.txt
спробуйте,printf '%s\0' *.txt | xargs -r0 cat >all
а потімmv all all.txt
уникнути посилання на файл.