Відповіді:
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уникнути посилання на файл.