Tôi có hai tệp: file1
và file2
. 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?
Sử dụng bash dựng sẵn chuyển hướng (tldp) :
cat file2 >> file1
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.
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.
Hãy thử lệnh này:
cat file2 >> file1
lệnh bạn tìm kiếm là
cat file2 >> file1
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.
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
, file3
và file4
.
Từ trang người đàn ông:
-a, --append
append to the given FILEs, do not overwrite
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
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
và <
chuyển file2
thành STDIN.
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