it-swarm-vi.tech

Làm cách nào để nối một tệp này với tệp khác trong Linux từ trình bao?

Tôi có hai tệp: file1file2. Làm cách nào để thêm nội dung của file2 vào file1 để nội dung của file1 tiếp tục quá trình?

389
asir

Sử dụng bash dựng sẵn chuyển hướng (tldp) :

cat file2 >> file1
570
David

cat file2 >> file1

Toán tử >> nối đầu ra vào tệp đã đặt tên hoặc tạo tệp được đặt tên nếu nó không tồn tại.

cat file1 file2 > file3

Điều này nối hai hoặc nhiều tệp thành một. Bạn có thể có nhiều tệp nguồn như bạn cần. Ví dụ,

cat *.txt >> newfile.txt

Cập nhật 20130902
[.__.] Trong các bình luận, eumiro gợi ý "đừng thử cat file1 file2 > file1." Lý do điều này có thể không dẫn đến kết quả mong đợi là tệp nhận chuyển hướng được chuẩn bị trước khi lệnh ở bên trái của > được thực thi. Trong trường hợp này, file1 đầu tiên được cắt ngắn thành 0 và được mở cho đầu ra, sau đó lệnh cat cố gắng ghép tệp có độ dài bằng 0 cộng với nội dung của file2 thành file1. Kết quả là nội dung ban đầu của file1 bị mất và ở vị trí của nó là một bản sao của file2 có lẽ không như mong đợi.

Cập nhật 20160919
[.___.] Trong các bình luận, tpartee đề nghị liên kết với các nguồn/thông tin sao lưu. Để tham khảo có thẩm quyền, tôi hướng người đọc tốt bụng đến trang sh man tại linuxcommand.org, trong đó nêu rõ:

Trước khi một lệnh được thực thi, đầu vào và đầu ra của nó có thể được chuyển hướng bằng cách sử dụng một ký hiệu đặc biệt được giải thích bởi Shell.

Mặc dù điều đó cho người đọc biết những gì họ cần biết nhưng rất dễ bỏ lỡ nếu bạn không tìm kiếm nó và phân tích cú pháp câu lệnh của Word. Từ quan trọng nhất ở đây là "trước đây". Việc chuyển hướng được hoàn thành (hoặc thất bại) trước khi lệnh được thực thi.

Trong trường hợp ví dụ của cat file1 file2 > file1, Shell thực hiện chuyển hướng trước tiên để các tay cầm I/O được đặt đúng chỗ trong môi trường mà lệnh sẽ được thực thi trước khi nó được thực thi.

Một phiên bản thân thiện hơn trong đó ưu tiên chuyển hướng được trình bày theo chiều dài có thể được tìm thấy tại trang web của Ian Allen dưới dạng phần mềm khóa học Linux. Ghi chú chuyển hướng I/O của anh ấy trang có nhiều điều để nói về chủ đề này, bao gồm cả việc quan sát rằng chuyển hướng hoạt động ngay cả khi không có lệnh. Truyền cái này cho Shell:

$ >out

... Tạo một tập tin trống có tên. Shell trước tiên thiết lập chuyển hướng I/O, sau đó tìm kiếm một lệnh, không tìm thấy và hoàn thành thao tác.

285
T.Rob

Lưu ý: nếu bạn cần sử dụng Sudo, hãy làm điều này:

Sudo bash -c 'cat file2 >> file1'

Phương thức thông thường chỉ đơn giản là trả trước Sudo cho lệnh sẽ thất bại, vì sự leo thang đặc quyền không chuyển sang chuyển hướng đầu ra.

39
jdunk

Hãy thử lệnh này:

cat file2 >> file1
27
eumiro

lệnh bạn tìm kiếm là

cat file2 >> file1
22
jmatraszek

Chỉ để tham khảo, sử dụng ddresTHER cung cấp một cách gián đoạn để đạt được nhiệm vụ nếu, ví dụ, bạn có các tệp lớn và cần phải tạm dừng và sau đó tiếp tục tại một số điểm sau:

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

logfile là bit quan trọng. Bạn có thể làm gián đoạn quá trình với Ctrl-C và tiếp tục lại bằng cách chỉ định lại chính xác cùng một lệnh và ddresTHER sẽ đọc logfile và tiếp tục từ nơi nó dừng lại. Cờ -o A báo cho ddresTHER bắt đầu từ byte A trong tệp đầu ra (file1). Vì vậy, wc --bytes file1 | awk '{ print $1 }' chỉ trích xuất kích thước của file1 theo byte (bạn chỉ có thể dán vào đầu ra từ ls nếu bạn muốn).

Như được chỉ ra bởi ngks trong các bình luận, nhược điểm là ddresTHER có thể sẽ không được cài đặt theo mặc định, vì vậy bạn sẽ phải cài đặt thủ công. Một điều phức tạp khác là có hai phiên bản ddresTHER có thể nằm trong kho của bạn: xem câu hỏi về vấn đề này để biết thêm thông tin. Phiên bản bạn muốn là GNU ddresTHER và trên các hệ thống dựa trên Debian là gói có tên gddrescue:

Sudo apt install gddrescue

Đối với các bản phân phối khác, hãy kiểm tra hệ thống quản lý gói của bạn để biết phiên bản GNU của ddresTHER.

13
Zorawar

Giải pháp khác:

cat file1 | tee -a file2

tee có lợi ích mà bạn có thể thêm vào bao nhiêu tệp tùy thích, ví dụ:

cat file1 | tee -a file2 file3 file3

sẽ nối các nội dung của file1 vào file2, file3file4.

Từ trang người đàn ông:

-a, --append
       append to the given FILEs, do not overwrite
1
Stefan van den Akker

Tôi không chắc về điều này, nhưng nhiều người đã nói với tôi ở đây rằng sử dụng lệnh cat để hiển thị nội dung của một tệp không phải là một cách thực hành tốt và ai đó đã chia sẻ this liên kết với tôi.

Xem xét tất cả điều này, cách sau đây có vẻ tốt hơn.

echo -n "$(<file1)" >> file2
0
Mihir

Bạn cũng có thể làm điều này mà không cần cat, mặc dù thành thật mà nói cat dễ đọc hơn:

>> file1 < file2

>> nối thêm STDIN vào file1< chuyển file2 thành STDIN.

0
Alok Singh

cat có thể là giải pháp dễ dàng nhưng nó trở nên rất chậm khi chúng tôi ghép các tệp lớn, find -print là để giải cứu bạn, mặc dù bạn phải sử dụng mèo một lần.

[email protected] ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt

 [email protected] ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


[email protected] ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1

real    0m2.516s
user    0m0.028s
sys     0m2.204s
0
Amey Jadiye