Bagaimana cara bergabung dengan file teks?

21

Saya telah menyimpan banyak dokumen sebagai txt. Saya ingin mencetaknya bersama jadi pertama-tama saya ingin mereka bersama dalam satu file. Urutan tidak penting dalam kasus ini.

Saya ingin solusi yang tidak melibatkan pengetikan nama file yang akan digabung, tetapi yang hanya akan menggabungkan semua file txt dalam folder.

Bisakah saya melakukannya dengan perintah atau GUI?


Saya melihat di sini . Tidak tahu cara menggunakannya join.


sumber

Jawaban:

43

Gunakan catdengan redirection output. Sintaks: cat file [file] [[file] ...] > joined-file.

Contoh hanya dengan dua file (Anda dapat memiliki lebih banyak):

$ 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

Jika Anda memiliki "banyak dokumen", manfaatkan globbing shell (pola):

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

Ini akan menggabungkan semua file di direktori itu ke direktori saat ini (mencegahnya agar tidak cocok dengan file output itu sendiri). Ini benar-benar independen untuk penggunaan catdan pengalihan output - hanya saja Bash menyediakan semua file sebagai argumen cat.


Jenis file

Itu hanya akan merekatkan (bergabung) file bersama seperti yang akan Anda lakukan dengan kertas dan pita. Tidak peduli tentang format file aktual yang mampu menangani ini. Ini akan bekerja untuk file teks, tetapi tidak untuk PDF, ODT, dll. Yah, itu akan merekatkan mereka bersama-sama, tapi itu bukan PDF / ODT yang valid lagi.


Urutan bergabung

Seperti yang ditunjukkan oleh phoibos , shell globbing akan menghasilkan urutan nama file berdasarkan abjad. Beginilah cara kerja Bash and shell globbing.


Tambahan tentang input file is output filekesalahan

Ketika pola file input cocok dengan file yang sama dengan yang di-output, ini akan menyebabkan kesalahan. Ini fitur keamanan. Contoh: cat *.txt > out.txtmenjalankan kedua kalinya akan menyebabkan ini.

Apa yang dapat Anda lakukan:

  • Pilih pola yang lebih spesifik untuk mencocokkan file input aktual, tidak cocok dengan nama output. Contoh: pola file input *.txtdengan file output output.outtidak akan bertabrakan.
  • Bekerja di direktori yang berbeda. Dalam contoh di atas, saya telah menggunakan input-files-dirdirektori terpisah untuk menempatkan semua file, dan output ke direktori kerja saat ini. Ini membuatnya tidak mungkin untuk mendapatkan kesalahan ini.
gertvdijk
sumber
@cipricus Ya, tapi itu globbing shell yang sangat dasar (pola). Cobalah pola Anda menggunakan lshanya daftar yang cocok. Misalnya ls *.txtuntuk melihat apa yang dicocokkan.
gertvdijk
2
@cipricus Bagaimana dengan cat * .txt> JoinFile.txt?
Sadi
1
Ini lebih masuk akal sebenarnya, cat pertama menangkap semua file .txt dan kedua bergabung dengan mereka dan ketiga itu menciptakan file .txt baru yang tidak dapat ditangkap pada langkah pertama ;-)
Sadi
1
@cipricus Ini hanya menggabungkan file. Seperti halnya Anda menggunakan potongan kertas dengan lem dan selotip! Sebagian besar format file "dokumen" seperti PDF, yang dikompresi tidak mengizinkan ini. Gunakan editor PDF. Tapi bagaimanapun, pertanyaan Anda adalah tentang file teks .
gertvdijk
1
Saya sepenuhnya memahami bahwa metode yang Anda sarankan (membuat subdir, memindahkan file, dan kemudian bergabung) mungkin merupakan cara yang lebih baik dalam beberapa kasus. Tetapi jika kita hanya ingin bergabung dengan semua file teks (semua memiliki ekstensi .txt) di direktori saat ini cat * .txt> JoinFile.txt melakukan pekerjaan dengan sempurna. Saya baru saja mengujinya karena penasaran dan itu berhasil, dan sepertinya cipricus juga menemukan hasil yang sama. (Dan sistem sudah mulai mengeluh bahwa kita tidak boleh mengobrol di sini, kalau tidak, saya akan bertanya apakah Anda dapat mengajarkan pemula ini bagaimana Anda dapat menggunakan pemformatan dalam komentar ini tanpa bilah alat ;-)
Sadi
12

Cara mudah untuk melakukannya adalah dengan menggunakan cat:

cat file1 file2 > joined_file

Jika Anda hanya mengeluarkan cat file1 file2Anda akan melihat kedua file pada output standar. Dengan menggunakan >, Anda hanya mengarahkan output standar ke file. Itu akan bekerja juga dengan perintah lain.

Jorge Suárez de Lis
sumber
Silakan baca pertanyaannya. Anda mengatakan untuk menentukan nama file individual, yang OP secara khusus tidak ingin lakukan!
Sri
2
Itu tidak ada dalam pertanyaan awal. Saya belum memperbarui jawaban saya karena jawaban yang lebih lengkap muncul.
Jorge Suárez de Lis
@ JorgeSuárezdeLis Meskipun jawaban ini tidak secara langsung membantu OP dengan pertanyaannya, harap dicatat bahwa jawaban ini mungkin akan membantu orang lain yang hanya memiliki beberapa file yang ingin digabungkan. (oh hei, seperti saya! terima kasih! ^ - ^) +1
Souta
@ JorgeSuárezdeLis Memang. Anda telah menjawab revisi 2 dari pertanyaan dengan sangat baik. Beberapa menit kemudian, revisi 3 , mengubah persyaratan tentang jawaban.
gertvdijk
5

Lakukan dengan loop sederhana:

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

>> ditambahkan ke file.

Catatan: Jika karena alasan tertentu Anda harus menjalankan perintah lagi, Anda harus menghapus complete.txt, jika tidak, Anda akan menulis file itu sendiri, yang tidak berfungsi.

phoibos
sumber
5
Ini akan bekerja juga, tetapi saya tidak melihat perlunya for-loop jika Anda dapat menggunakan argumen cat.
gertvdijk
1
Ya, tentu saja Anda benar. Saya hanya tidak yakin tentang perintah sord menggunakan cat *.txt. Untuk loop harus diurutkan.
phoibos
1
Ternyata, * dijamin dalam urutan abjad .
phoibos
Ya, itu adalah shell yang sama persis globbing. Tidak masalah apakah Anda menggunakannya di foratau di mana pun di Bash.
gertvdijk
4

Jika file yang ingin Anda gabungkan semuanya berakhir .txt, buat tetap sederhana:

cat *.txt > combined.txt

Jika direktori hanya berisi file teks, itu juga sederhana:

cat * > combined.txt

(Perhatikan bahwa setelah Anda membuat combined.txt, melakukannya lagi akan memasukkannya dalam perluasan *, yang mengarah ke perilaku aneh).

Jika Anda ingin memilih beberapa file dalam direktori dan bukan yang lain, yang terbaik adalah jika nama file memungkinkan Anda untuk membedakan mana yang Anda inginkan. Jika tidak, Anda bisa disukai find. Tapi saya ragu Anda harus melangkah sejauh itu.

alexis
sumber
thnx. jika Anda melihat komentar pada jawaban yang diterima, Sadi menyarankan hal itu dalam komentar. jika jawaban Anda adalah jawaban Anda yang pertama adalah apa yang saya butuhkan. lihat milikku juga: menambahkan bahwa di menu kustom
Terima kasih untuk umpan baliknya. Ya, saya melihatnya sekarang, itu agak dikaburkan ...
alexis
4

Skrip tindakan khusus Thunar yang ditulis oleh cipricus juga mengilhami saya untuk menulis skrip Nautilus yang serupa dan saya pikir mungkin bermanfaat bagi orang lain yang melihat T&J ini untuk referensi tentang subjek ini. Jadi begini:

#!/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"
Sadi
sumber
@ David Foerster Terima kasih atas hasil editnya. Saya tidak memiliki masalah dengan versi lama (dengan kasus pengujian terbatas saya) dan saya juga tidak melihat masalah dengan versi yang ditingkatkan ini. Maaf jika saya menyebabkan ketidaknyamanan karena cacat pada versi sebelumnya.
Sadi
Itu tidak cacat, tetapi berisi loop yang tidak perlu, yang membuat kode lebih sulit dimengerti, imho.
David Foerster
2

Ini adalah pelengkap dan variasi untuk jawaban lain, terkait dengan menempatkan solusi ini untuk bekerja dalam tindakan kebiasaan Thunar.

Tidak semua dari mereka dapat digunakan dengan cara ini, tetapi ada juga yang bisa.

Saya pikir yang paling menarik adalah bisa menggabungkan file yang dipilih dari menu konteks Thunar .

Ini adalah variasi dari apa yang disarankan oleh Sadi dalam komentar untuk gertvdijk 's jawabannya :

   cat %N > JoinedFile

Hanya file yang dipilih yang akan digabung. Batasi kondisi tampilan untuk file teks.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


Terima kasih khusus kepada Sadi yang komentarnya memberi saya solusi paling jelas dan terkini untuk masalah saya.

Saya menerima gertvdijk 's jawaban sebagai definitif. Tidak hanya itu adalah kesempatan untuk komentar Sadi, tetapi tampaknya lebih bernilai bagi orang lain, memberikan solusi yang diperdebatkan dengan baik dan lengkap (meskipun agak di atas keterampilan membaca CLI saya).

Komunitas
sumber
2

Anda dapat mencoba findperintah juga,

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

Ia menemukan .txtfile di dalam direktori saat ini dan menjalankan catperintah pada setiap file yang didirikan. Akhirnya seluruh output dialihkan ke nama file file(dibuat dalam arus langsung itu sendiri).

Penjelasan:

.                  # 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.
Avinash Raj
sumber
-2

Anda juga bisa menggunakan utilitas online seperti merge-files-online.com

StackMan
sumber