Làm thế nào để tham gia tập tin văn bản?


21

Tôi đã lưu nhiều tài liệu như txt. Tôi muốn in chúng cùng nhau vì vậy trước tiên tôi muốn chúng cùng nhau trong một tệp. Thứ tự không quan trọng trong trường hợp này.

Tôi muốn một giải pháp không liên quan đến việc nhập tên của các tệp sẽ được hợp nhất, nhưng một giải pháp sẽ hợp nhất tất cả các tệp txt trong thư mục.

Tôi có thể làm điều đó với một lệnh hoặc một số GUI không?


Tôi nhìn vào đây . Không biết cách sử dụng join.

Câu trả lời:


43

Sử dụng catvới chuyển hướng đầu ra. Cú pháp : cat file [file] [[file] ...] > joined-file.

Ví dụ chỉ với hai tệp (bạn có thể có nhiều tệp khác):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

Trong trường hợp bạn có "nhiều tài liệu", hãy sử dụng shell globalbing (mẫu):

cat input-files-dir/* > joined-file

Điều này sẽ nối tất cả các tệp trong thư mục đó với thư mục hiện tại (ngăn không cho nó khớp với tệp đầu ra). Nó hoàn toàn độc lập với việc sử dụng catvà chuyển hướng đầu ra - đó chỉ là Bash cung cấp tất cả các tệp làm đối số cat.


Loại tập tin

Nó sẽ chỉ dán (nối) các tập tin với nhau như bạn làm với giấy và băng. Nó không quan tâm đến định dạng tệp thực tế có khả năng xử lý này. Nó sẽ hoạt động cho các tệp văn bản, nhưng không phải cho các tệp PDF, ODT, v.v ... Vâng, nó sẽ kết dính chúng lại với nhau, nhưng nó không còn là một tệp PDF / ODT hợp lệ nữa.


Thứ tự tham gia

Như phoibos đã chỉ ra vỏ toàn cầu sẽ dẫn đến thứ tự chữ cái của tên tệp. Đây là cách Bash và shell Globing hoạt động.


Phụ lục về input file is output filelỗi

Khi mẫu của các tệp đầu vào khớp với cùng một tệp là đầu ra, điều này sẽ gây ra lỗi. Đây là một tính năng an toàn. Ví dụ: cat *.txt > out.txtchạy lần thứ hai sẽ gây ra điều này.

Những gì bạn có thể làm về nó:

  • Chọn một mẫu cụ thể hơn để khớp với các tệp đầu vào thực tế, không khớp với tên đầu ra. Ví dụ: mẫu tệp đầu vào *.txtvới tệp đầu ra output.outsẽ không va chạm.
  • Làm việc trong các thư mục khác nhau. Trong ví dụ trên tôi đã sử dụng một input-files-dirthư mục riêng để đặt tất cả các tệp vào và xuất ra thư mục làm việc hiện tại. Điều này làm cho nó không thể có được lỗi này.

@cipricus Có, nhưng đó là hình nền vỏ rất cơ bản (mẫu). Hãy thử các mẫu của bạn bằng cách lschỉ liệt kê các trận đấu. Ví dụ ls *.txtđể xem những gì đang được khớp.
gertvdijk

2
@cipricus Làm thế nào về con mèo * .txt> Gia nhậpFile.txt?
Sadi

1
Điều này thực sự phổ biến hơn, mèo trước tiên bắt tất cả các tệp .txt và thứ hai nó tham gia vào chúng và thứ ba nó tạo ra một tệp .txt mới không thể bắt được ở bước đầu tiên ;-)
Sadi

1
@cipricus Nó chỉ tham gia các tập tin. Giống như bạn sẽ làm bằng cách sử dụng các mảnh giấy với keo và băng! Hầu hết các định dạng tệp "tài liệu" như PDF, được nén không cho phép điều này. Sử dụng trình chỉnh sửa PDF. Nhưng dù sao, câu hỏi của bạn là về các tập tin văn bản .
gertvdijk

1
Tôi hoàn toàn hiểu rằng phương pháp bạn đề xuất (tạo một thư mục con, di chuyển tệp và sau đó tham gia) có thể là một cách tốt hơn trong một số trường hợp. Nhưng nếu chúng ta chỉ muốn tham gia tất cả các tệp văn bản (tất cả đều có phần mở rộng .txt) trong thư mục hiện tại thì mèo * .txt> JoinFile.txt thực hiện công việc một cách hoàn hảo. Tôi chỉ thử nó vì tò mò và nó hoạt động, và có vẻ như cipricus cũng đã tìm thấy kết quả tương tự. (Và hệ thống đã bắt đầu phàn nàn rằng chúng ta không nên trò chuyện ở đây, nếu không tôi sẽ hỏi bạn có thể dạy người mới này cách bạn có thể sử dụng định dạng trong các nhận xét này mà không cần thanh công cụ hay không ;-)
Sadi

12

Một cách đơn giản để làm điều đó là sử dụng mèo:

cat file1 file2 > joined_file

Nếu bạn chỉ phát hành, cat file1 file2bạn sẽ thấy cả hai tệp trên đầu ra tiêu chuẩn. Bằng cách sử dụng >, bạn chỉ cần chuyển hướng đầu ra tiêu chuẩn sang một tệp. Điều đó cũng sẽ làm việc với các lệnh khác.


Xin vui lòng đọc câu hỏi. Bạn đang yêu cầu chỉ định tên tệp riêng lẻ mà OP đặc biệt không muốn làm!
Sri

2
Đó không phải là trong câu hỏi ban đầu. Tôi đã không cập nhật câu trả lời của mình kể từ khi câu trả lời đầy đủ hơn xuất hiện.
Jorge Suárez de Lis

@ JorgeSuárezdeLis Mặc dù câu trả lời này không trực tiếp giúp OP với câu hỏi của anh ấy / cô ấy, xin lưu ý rằng câu trả lời này có thể sẽ giúp người khác chỉ có một vài tệp mà họ muốn hợp nhất. (oh hey, giống như tôi! cảm ơn bạn! ^ - ^) +1
Souta

@ JorgeSuárezdeLis Thật vậy. Bạn đã trả lời bản sửa đổi 2 của câu hỏi hoàn toàn tốt. Vài phút sau, sửa đổi 3 , đã thay đổi các yêu cầu về câu trả lời.
gertvdijk

5

Làm điều đó với một vòng lặp đơn giản:

for i in *.txt; do cat "$i" >> complete.txt; done

>> nối vào tập tin

Lưu ý: Nếu vì lý do nào đó bạn phải chạy lại lệnh, bạn phải xóa complete.txt, nếu không, bạn sẽ ghi tệp vào chính nó, không hoạt động.


5
Điều này cũng sẽ hoạt động, nhưng tôi không thấy sự cần thiết của vòng lặp for nếu bạn có thể sử dụng các đối số cat.
gertvdijk

1
Vâng, bạn đúng tất nhiên. Tôi chỉ không chắc chắn về thứ tự sord sử dụng cat *.txt. Vòng lặp for nên được sắp xếp.
phoibos


Vâng, đó là vỏ bọc chính xác giống nhau. Không quan trọng bạn sử dụng nó ở forbất cứ nơi nào khác trong Bash.
gertvdijk

4

Nếu các tệp bạn muốn kết hợp tất cả kết thúc .txt, hãy giữ cho nó đơn giản:

cat *.txt > combined.txt

Nếu thư mục chỉ chứa các tệp văn bản, nó cũng đơn giản:

cat * > combined.txt

(Lưu ý rằng một khi bạn tạo combined.txt, thực hiện lại sẽ bao gồm nó trong việc mở rộng *, dẫn đến hành vi kỳ quặc).

Nếu bạn muốn chọn một số tệp trong thư mục chứ không phải các tệp khác, tốt nhất là tên tệp cho phép bạn phân biệt tệp nào bạn muốn. Nếu không, bạn có thể nhận được ưa thích với find. Nhưng tôi nghi ngờ bạn cần phải đi xa như vậy.


thnx. Nếu bạn nhìn vào các bình luận cho câu trả lời được chấp nhận, Sadi đã gợi ý chính xác điều đó trong một bình luận. nếu câu trả lời của bạn là câu hỏi đầu tiên của bạn sẽ là điều tôi cần. hãy xem của tôi quá: thêm vào đó trong menu tùy chỉnh

Cảm ơn vì bạn đã phản hồi. Vâng, tôi thấy nó bây giờ, nó bị che khuất một chút ...
alexis

4

Kịch bản hành động tùy chỉnh Thunar được viết bởi cipricus cũng truyền cảm hứng cho tôi để viết một kịch bản Nautilus tương tự và tôi nghĩ rằng nó có thể hữu ích cho những người khác xem Q & A này để tham khảo về chủ đề này. Vì vậy, đây là:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"

@David Foerster Cảm ơn bạn đã chỉnh sửa. Tôi không có bất kỳ vấn đề nào với phiên bản cũ (với các trường hợp thử nghiệm giới hạn của tôi) và tôi cũng không thấy bất kỳ vấn đề nào với phiên bản cải tiến này. Xin lỗi nếu tôi gây ra bất kỳ sự bất tiện nào do lỗi trong phiên bản trước.
Sadi

Nó không phải là thiếu sót, nhưng nó chứa một vòng lặp không cần thiết, làm cho mã khó hiểu hơn, imho.
David Foerster

2

Đây là một bổ sung và một biến thể cho các câu trả lời khác, liên quan đến việc đưa các giải pháp này hoạt động trong các hành động tùy chỉnh của Thunar.

Không phải tất cả chúng đều có thể sử dụng theo cách này, nhưng một số thì có.

Tôi nghĩ rằng thú vị nhất là có thể hợp nhất các tệp được chọn từ menu ngữ cảnh của Thunar .

Đây là một biến thể từ những gì được đề xuất bởi Sadi trong một bình luận cho câu trả lời của gertvdijk :

   cat %N > JoinedFile

Chỉ các tập tin được chọn sẽ được tham gia. Hạn chế điều kiện xuất hiện cho các tập tin văn bản.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Đặc biệt cảm ơn Sadi , người đã bình luận cung cấp cho tôi giải pháp rõ ràng và chính xác nhất cho vấn đề của tôi.

Tôi chấp nhận câu trả lời của gertvdijk là dứt khoát. Không chỉ là dịp để bình luận của Sadi, mà dường như còn có giá trị hơn nữa đối với những người khác, cung cấp một giải pháp hoàn hảo và đầy tranh cãi (mặc dù có phần cao hơn kỹ năng đọc CLI của tôi).


2

Bạn cũng có thể thử findlệnh,

find . -name "*.txt" -type f -exec cat {} + > file

Nó tìm thấy .txtcác tập tin trong thư mục hiện tại và thực thi catlệnh trên mỗi tập tin thành lập. Cuối cùng, toàn bộ đầu ra được chuyển hướng đến tên tệp file(được tạo trong chính hiện tại trực tiếp).

Giải trình:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.