Tôi có hai tập tin: file1
và file2
. Làm thế nào để tôi nối các nội dung của file2
để file1
nội dung của file1
quá trình tiếp tục?
Tôi có hai tập tin: file1
và file2
. Làm thế nào để tôi nối các nội dung của file2
để file1
nội dung của file1
quá trình tiếp tục?
Câu trả lời:
Sử dụng chuyển hướng bash dựng sẵn (tldp) :
cat file2 >> file1
sudo
vào cat
lệnh (và nhập thông tin nếu được nhắc).
tee
chương trình : cat 1 | tee -a 2 3
. Bạn có thể đặt bao nhiêu tệp tùy thích sau khi chuyển đổi --append
(hoặc -a
viết tắt).
cat file2 >> file1
Các >>
nhà khai thác gắn thêm đầu ra cho các tập tin có tên hoặc tạo ra các tập tin có 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 lệnh >
được thực thi. Trong trường hợp này, đầu tiên file1
được cắt ngắn thành độ dài bằng 0 và được mở cho đầu ra, sau đó cat
lệnh cố gắng nối tệp hiện có độ dài bằng không cộng với nội dung file2
vào file1
. Kết quả là nội dung ban đầu file1
bị mất và ở vị trí của nó là một bản sao file2
mà 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.
Trong khi điều đó nói với người đọc những gì họ cần biết thì rất dễ bỏ lỡ nếu bạn không tìm kiếm nó và phân tích cú pháp từng câu. Từ quan trọng nhất ở đây là "trước". 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. Trang Ghi chú chuyển hướng I / O của anh ấy 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 vào cái vỏ:
$ >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.
cat file1 file2 > file1
- điều này sẽ không hoạt động như bạn có thể đang chờ.
>>
mà sẽ sửa đổi các tập tin file1
. T.Rob đã làm một công việc vượt trội hơn nhiều là giải thích câu trả lời của mình thay vì chỉ chạy đua để gửi một cái gì đó, trên thực tế, không chính xác. Dựa trên văn bản của câu hỏi, tôi tin rằng đó cat file1 file2 > file3
là lệnh thích hợp mà @asir đang tìm kiếm.
>
được thực hiện trước tiên. Vì vậy, việc thực thi cat file1 file2 > file1
đầu tiên sẽ ghi đè file1
sau đó cố gắng sao chép tệp có độ dài bằng không vào chính nó. Điều này có ý nghĩa khi bạn nghĩ về thứ tự các hoạt động có thể và nên xảy ra nhưng đủ tinh tế để khiến nhiều người ngạc nhiên. Vì vậy, nếu không có gì khác, eumiro và bạn đã nhắc cải thiện thêm cho câu trả lời. Cảm ơn vì điều đó!
>>
thêm vào tệp và >
thay thế tệp.
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 pháp thông thường chỉ đơn giản là chuẩn bị trước sudo
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.
cat file2 | sudo tee -a file1 > /dev/null
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
Đây 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 nó 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ó rời đi. Các -o A
lá cờ nói ddrescue bắt đầu từ byte Một trong file đầu ra ( file1
). Vì vậy, wc --bytes file1 | awk '{ print $1 }'
chỉ cần trích xuất kích thước của file1
byte (bạn có thể chỉ cần 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
để file2
, file3
và file4
.
Từ trang người đàn ông:
-a, --append
append to the given FILEs, do not overwrite
cat
có thể là giải pháp dễ dàng nhưng điều đó 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.
amey@xps ~/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
amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
amey@xps ~/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
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
và nó sẽ tạo ra kết quả tương tự với lệnh chỉ con mèo của bạn.
Bạn cũng có thể làm điều này mà không cần cat
, mặc dù trung thực cat
là dễ đọc hơn:
>> file1 < file2
Việc >>
nối STDIN vào file1
và kết <
xuất file2
thành STDIN .