Câu trả lời:
ls *.txt | xargs cat >> all.txt
có thể hoạt động tốt hơn một chút, vì nó sẽ nối vào all.txt thay vì tạo lại sau mỗi tệp.
Nhân tiện, cat *.txt >all.txt
cũng sẽ làm việc. :-)
Nếu một số tên tệp của bạn chứa ', "hoặc dấu cách xargs
sẽ không thành công do sự cố dấu phân cách
Nói chung không bao giờ chạy xargs
mà không -0 vì nó sẽ quay lại và cắn bạn một ngày nào đó.
Thay vào đó, hãy xem xét sử dụng GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
hoặc nếu bạn thích:
ls *.txt | parallel cat >> tmp/all.txt
Tìm hiểu thêm về Song song GNU http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt
là một tệp trong cùng một thư mục, vì vậy mèo bị lẫn lộn khi nó muốn ghi từ cùng một tệp vào cùng một tệp.
Mặt khác:
ls *.txt | xargs cat > tmp/all.txt
Điều này sẽ đọc từ các tệp văn bản trong thư mục hiện tại của bạn vào all.txt trong thư mục con (không bao gồm *.txt
).
Bạn cũng có thể đi qua một giới hạn độ dài dòng lệnh. Một phần lý do của việc sử dụng xargs
là nó phân tách đầu vào thành các khối có kích thước dòng lệnh an toàn. Vì vậy, hãy tưởng tượng một tình huống trong đó bạn có hàng trăm ngàn tệp .txt trong thư mục. ls *.txt
sẽ thất bại. Bạn sẽ cần phải làm
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
trong trường hợp này là một biểu thức chính quy khớp với mọi thứ kết thúc bằng .txt (vì vậy nó không chính xác như thế *.txt
, vì nếu bạn có một tệp được gọi atxt
, thì *.txt
sẽ không khớp với nó, nhưng biểu thức chính quy sẽ.)
Việc sử dụng một đường dẫn khác là vì, như các câu trả lời khác đã chỉ ra, all.txt được khớp với mẫu *.txt
nên sẽ có xung đột giữa đầu vào và đầu ra.
Lưu ý rằng nếu bạn có bất kỳ tệp nào có '
tên của họ (và đây có thể là nguyên nhân gây ra unmatched single quote
lỗi), bạn sẽ muốn làm
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
Tùy chọn --null bảo grep sử dụng đầu ra được phân tách bằng \0
ký tự (còn gọi là null) thay vì dòng mới mặc định và -0
tùy chọn `xargs bảo nó mong đợi đầu vào của nó ở cùng định dạng. Điều này sẽ hoạt động ngay cả khi bạn có tên tệp với dòng mới trong đó.
ls
cho việc này . Nếu bạn thực sự không thể sử dụngcat *.txt >all.txt
thì hãy thửprintf '%s\0' *.txt | xargs -r0 cat >all
và sau đómv all all.txt
để tránh có tệp tham chiếu chính nó.