Чому це не працює? “Ls * .txt | xargs cat> all.txt "(усі файли в один txt документ)


20

Чому це не працює?

ls *.txt | xargs cat > all.txt

(Я хочу об'єднати вміст усіх текстових файлів в єдиний файл "all.txt".) Знайти з -exec також повинен працювати, але я дуже хотів би зрозуміти синтаксис xargs.

Спасибі


1
Хоча не використовуйте lsдля цього . Якщо ви дійсно не можете скористатися, cat *.txt >all.txtспробуйте, printf '%s\0' *.txt | xargs -r0 cat >allа потім mv all all.txtуникнути посилання на файл.
трійка

Відповіді:


27

ls *.txt | xargs cat >> all.txt

може працювати трохи краще, оскільки він додасться до all.txt, а не створює його знову після кожного файлу.

До речі, cat *.txt >all.txtтеж би спрацювало. :-)


6
Кіт * .txt> all.txt природно кращий. Дякую
айо

1
Однак, ... | xargs cat >> all.txt або> all.txt завжди повертає помилку з xargs: незрівнянна цитата ... Це тому, що xargs приймає все після нього як команду?
айо

1
У вас є назви файлів з пробілами? Якщо так, то використовуйте щось на кшталт "find / your / path -iname '* .txt' -print0 | xargs -0 cat >> all.txt"
Janne Pikkarainen

1
ні, я замінив усі пробіли імен файлів на . Але, думаючи про це, деякі імена файлів, ймовірно, включатимуть окремі цитати, як у listing_O'Connor .txt, це може бути проблемою!
айо

Так, тоді проблема. :) Найпростіший і найбезпечніший спосіб - це знайти find з -print0 у поєднанні з xargs -0 - тоді вся ланцюг буде використовувати символ NULL як роздільник, а пробіли та спеціальні символи будуть дбати автоматично.
Janne Pikkarainen

3

Якщо деякі ваші імена файлів містять "," або пробіл 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


1

all.txt це файл в одному каталозі, тому кішка плутається, коли хоче записати з того самого файлу в той самий файл.

З іншої сторони:

ls *.txt | xargs cat > tmp/all.txt

Це буде прочитано з текстових файлів у вашому поточному каталозі в all.txt у підкаталозі (не входить до *.txt).


Все ж наступна помилка: xargs: неперевершена одна цитата; за замовчуванням лапки спеціально для xargs , якщо ви не використовуєте -0 варіант
АЖ

1
У вас є .txt файл із одноцитатою на його ім’я?
Джеремі Сміт

0

Ви також можете натрапити на обмеження довжини командного рядка. Частина причини використання 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 повідомляє йому очікувати його введення в тому ж форматі. Це спрацює, навіть якщо б у вас були імена файлів з новими рядками.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.