Почему это не работает? «Ls * .txt | xargs cat> all.txt »(все файлы в одном текстовом документе)
20
Почему это не работает?
ls *.txt | xargs cat > all.txt
(Я хочу объединить содержимое всех текстовых файлов в один файл 'all.txt'.) Найти с помощью -exec также должно работать, но мне бы очень хотелось понять синтаксис xargs.
Хотя не используйте 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тоже будет работать. :-)
Тем не менее, ... | xargs cat >> all.txt или> all.txt всегда возвращают ошибку с xargs: непревзойденная одинарная кавычка ... Это потому, что xargs принимает все после него как команду?
Ajo
1
У вас есть имена файлов с пробелами? Если это так, используйте вместо этого что-то вроде «find / your / path -iname '* .txt' -print0 | xargs -0 cat >> all.txt»
Janne Pikkarainen
1
нет, я заменил все пространства имен файлов на . Но если подумать, некоторые имена файлов могут включать одинарные кавычки, как в листинге_O'Connor .txt, это может быть проблемой!
Ajo
Да, это проблема тогда. :) Самый простой и разумный способ - использовать поиск с -print0 в сочетании с xargs -0 - тогда вся цепочка будет использовать символ NULL в качестве разделителя, а пробелы и специальные символы будут обрабатываться автоматически.
Янне Пиккарайнен
3
Если некоторые из ваших имен файлов содержат ', "или пробел не xargsбудет выполнен из-за проблемы с разделителем
В общем, никогда xargsне бегайте без -0, так как он вернется и укусит вас однажды.
Попробуйте вместо этого использовать GNU Parallel:
Еще следующая ошибка: xargs: непревзойденная одинарная кавычка; по умолчанию кавычки являются специальными для xargs, если вы не используете опцию -0
ajo
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ошибки), вы можете захотеть сделать
Опция --null указывает grep использовать выходные данные, разделенные \0символом (или нулевым) вместо новой строки по умолчанию, а -0опция `xargs говорит ему ожидать ввода в том же формате. Это будет работать, даже если у вас есть имена файлов с символами новой строки.
ls
для этого . Если вы действительно не можете использовать,cat *.txt >all.txt
попробуйтеprintf '%s\0' *.txt | xargs -r0 cat >all
и затемmv all all.txt
избегайте ссылки на файл.Ответы:
ls *.txt | xargs cat >> all.txt
может работать немного лучше, так как он будет добавлять в all.txt вместо того, чтобы создавать его снова после каждого файла.
Кстати,
cat *.txt >all.txt
тоже будет работать. :-)источник
Если некоторые из ваших имен файлов содержат ', "или пробел не
xargs
будет выполнен из-за проблемы с разделителемВ общем, никогда
xargs
не бегайте без -0, так как он вернется и укусит вас однажды.Попробуйте вместо этого использовать GNU Parallel:
или если вы предпочитаете:
Узнайте больше о GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
источник
all.txt
это файл в том же каталоге, поэтому cat запутывается, когда хочет записать из того же файла в тот же файл.С другой стороны:
Это будет читать из текстовых файлов в вашем текущем каталоге в all.txt в подкаталоге (не входит в комплект
*.txt
).источник
Вы также можете столкнуться с ограничением длины командной строки. Одна из причин использования
xargs
заключается в том, что он разбивает входные данные на безопасные блоки размером с командную строку. Итак, представьте ситуацию, в которой у вас есть сотни тысяч .txt файлов в каталоге.ls *.txt
не удастся. Вам нужно будет сделать.txt$
в данном случае это регулярное выражение, совпадающее со всем, что заканчивается в .txt (так что это не совсем так*.txt
, поскольку, если у вас есть файл с именемatxt
, он*.txt
не будет совпадать с ним, но регулярное выражение будет.)Использование другого пути связано с тем, что, как указали другие ответы, шаблон all.txt соответствует шаблону,
*.txt
поэтому между входом и выходом может возникнуть конфликт.Обратите внимание, что если у вас есть какие-либо файлы с
'
их именами (и это может быть причинойunmatched single quote
ошибки), вы можете захотеть сделатьОпция --null указывает grep использовать выходные данные, разделенные
\0
символом (или нулевым) вместо новой строки по умолчанию, а-0
опция `xargs говорит ему ожидать ввода в том же формате. Это будет работать, даже если у вас есть имена файлов с символами новой строки.источник