Odpowiedzi:
ls *.txt | xargs cat >> all.txt
może działać nieco lepiej, ponieważ dołączałby do pliku all.txt zamiast tworzyć go ponownie po każdym pliku.
Nawiasem mówiąc, cat *.txt >all.txt
działałoby również. :-)
Jeśli niektóre nazwy plików zawierają „,” lub spacja xargs
nie powiedzie się z powodu problemu z separatorem
Zasadniczo nigdy nie biegnij xargs
bez -0, ponieważ wróci i cię ugryzie.
Zamiast tego rozważ użycie GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
lub jeśli wolisz:
ls *.txt | parallel cat >> tmp/all.txt
Dowiedz się więcej o GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt
jest plikiem w tym samym katalogu, więc cat jest zdezorientowany, gdy chce pisać z tego samego pliku do tego samego pliku.
Z drugiej strony:
ls *.txt | xargs cat > tmp/all.txt
Spowoduje to odczytanie plików tekstowych z bieżącego katalogu do pliku all.txt w podkatalogu (nie jest dołączony *.txt
).
Możesz także natknąć się na ograniczenie długości linii poleceń. Jednym z powodów użycia xargs
jest to, że dzieli dane wejściowe na bezpieczne fragmenty wielkości wiersza polecenia. Wyobraź sobie więc sytuację, w której masz w katalogu setki tysięcy plików .txt. ls *.txt
zawiedzie. Musisz to zrobić
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
w tym przypadku jest wyrażenie regularne pasujące do wszystkiego, co kończy się na .txt (więc nie jest dokładnie tak *.txt
, ponieważ jeśli masz plik o nazwie atxt
, to *.txt
nie pasuje do niego, ale wyrażenie regularne tak.)
Zastosowanie innej ścieżki polega na tym, że, jak wskazały inne odpowiedzi, plik all.txt jest dopasowywany do wzorca, *.txt
co spowodowałoby konflikt między danymi wejściowymi i wyjściowymi.
Pamiętaj, że jeśli masz '
w nazwie jakieś pliki (i może to być przyczyną unmatched single quote
błędu), powinieneś to zrobić
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
Opcja --null mówi grepowi, aby używał danych wyjściowych oddzielonych znakiem \0
(aka null) zamiast domyślnego znaku nowej linii, a -0
opcja `xargs mówi, że oczekuje wejścia w tym samym formacie. Działa to nawet, jeśli masz nazwy plików z nowymi liniami.
ls
do tego . Jeśli naprawdę nie możesz użyć,cat *.txt >all.txt
spróbuj,printf '%s\0' *.txt | xargs -r0 cat >all
a następniemv all all.txt
unikaj odwoływania się do pliku.