Metin dosyalarına nasıl katılınır?


21

Birçok belgeyi txt olarak kaydettim. Onları birlikte yazdırmak istiyorum, önce onları tek bir dosyada birlikte istiyorum. Bu durumda sipariş önemli değil.

Birleştirilecek dosyaların adlarını yazmayı içermeyen, ancak klasördeki tüm txt dosyalarını birleştiren bir çözüm istiyorum.

Bir komutla veya bir GUI ile yapabilir miyim?


Baktım burada . Nasıl kullanılacağını bilmiyorum join.

Yanıtlar:


43

catÇıkış yönlendirmesi ile kullanın . Sözdizimi şu şekildedir: cat file [file] [[file] ...] > joined-file.

Sadece iki dosyaya sahip bir örnek (daha fazlasına sahip olabilirsiniz):

$ 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

"Çok sayıda dokümanınız" olması durumunda, kabarıklık kürecemesinden (kalıplar) yararlanın:

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

Bu, bu dizindeki tüm dosyaları geçerli dizine ekler (çıkış dosyasının kendisiyle eşleşmesini önler). Bu, catyönlendirme ve çıkış yönlendirme kullanımından tamamen bağımsızdır - sadece tüm dosyaları argüman olarak sağlayan Bash'dir cat.


Dosya türleri

Sadece kağıt ve bantla yaptığınız gibi dosyaları birbirine yapıştırır (birleştirir). Asıl dosya formatının bununla başa çıkabileceği umrunda değil. Metin dosyaları için çalışacak, ancak PDF'ler, ODT'ler, vb. İçin çalışmayacak. Peki, bunları bir araya getirecek, ancak artık geçerli bir PDF / ODT değil.


Birleştirme sırası

Foibos'un işaret ettiği gibi , kabuk toplanması dosya adlarının alfabetik sıralaması ile sonuçlanacaktır. Bash ve Shell Globbing bu şekilde çalışır.


input file is output fileHata hakkında zeyilname

Giriş dosyalarının düzeni, çıktıyla aynı dosyayla eşleştiğinde, bu bir hataya neden olur. Bu bir güvenlik özelliği. Örnek: cat *.txt > out.txtİkinci seferde koşmak buna sebep olur.

Bu konuda ne yapabilirsin:

  • Çıktı adıyla eşleşmeyen gerçek giriş dosyalarıyla eşleştirmek için daha spesifik bir desen seçin. Örnek: *.txtÇıktı dosyası olan girdi dosyaları kalıbı output.outçarpışmaz.
  • Farklı dizinlerde çalışın. Yukarıdaki örnekte input-files-dir, tüm dosyaları yerleştirmek ve geçerli çalışma dizinine çıktı almak için ayrı bir dizin kullandım . Bu, bu hatayı almak imkansız hale getirir.

@cipricus Evet, ama bu çok temel bir kabuk küresi (kalıplar). lsSadece eşleşmeleri listelemek için kalıplarınızı deneyin . Örneğin ls *.txteşleşti ediliyor görmek için.
gertvdijk

2
@cipricus Nasıl kedi * .txt> JoinedFile.txt?
Sadi

1
Bu daha sağduyulu, aslında kedi ilk önce tüm .txt dosyalarını yakalar ve ikinci olarak onlara katılır ve üçüncüsü ilk adımda yakalanamayan yeni bir .txt dosyası oluşturur ;-)
Sadi

1
@cipricus Bu sadece dosyaları birleştirir. Yapışkan ve bantlı kağıt parçaları kullanarak yapardın! Sıkıştırılmış PDF gibi çoğu "belge" dosya biçimi buna izin vermez. Bir PDF editörü kullanın. Neyse, sorunuz metin dosyalarıyla ilgiliydi .
gertvdijk

1
Önerdiğiniz yöntemin (bir alt dizin oluşturma, dosyaları taşıma ve sonra katılma) bazı durumlarda daha iyi bir yol olabileceğini tam olarak anlıyorum. Ancak mevcut dizindeki tüm metin dosyalarına (tümü .txt uzantılı) katılmak istiyorsak cat * .txt> JoinedFile.txt işi mükemmel yapıyor. Sadece meraktan test ettim ve işe yarıyor, aynı zamanda cipricus de aynı sonucu buldu. (Sistem burada sohbet etmememiz gerektiği konusunda şikâyet etmeye başladı, aksi takdirde bu acemiye, bu yorumlarda biçimlendirmeyi araç çubuğu olmadan nasıl kullanabileceğinizi öğretip öğretemeyeceğinizi sorardım ;-)
Sadi

12

Bunu yapmanın basit bir yolu kedi kullanmaktır:

cat file1 file2 > joined_file

Sadece sorun çıkarırsanız cat file1 file2standart çıktıda her iki dosyayı da görürsünüz. Kullanarak >, standart çıktıyı bir dosyaya yönlendiriyorsunuzdur. Bu başka bir komutla da çalışacaktır.


Lütfen soruyu okuyun. OP'nin özellikle yapmak istemediği, tek tek dosya isimleri belirlemenizi söylüyorsunuz!
Sri

2
That was değil orijinal söz konusu. Daha eksiksiz cevaplar göründüğü için cevabımı güncellemedik.
Jorge Suárez de Lis,

@ JorgeSuárezdeLis Bu cevap sorusu ile doğrudan OP'ye yardımcı olmamakla birlikte, lütfen bu cevabın muhtemelen birleştirmek istedikleri birkaç dosyaya sahip başka birine yardım edeceğini unutmayın. (oh hey, benim gibi! teşekkür ederim! ^ - ^) +1
Souta

@ JorgeSuárezdeLis Gerçekten. Sorunun 2. revizyonunu tamamen iyi cevapladınız . Birkaç dakika sonra, revizyon 3 , cevaplarla ilgili şartları değiştirdi.
gertvdijk 08

5

Basit bir döngü ile yapın:

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

>> dosyaya ekler.

Not: Herhangi bir nedenden dolayı komutu tekrar çalıştırmanız gerekiyorsa, silmeniz gerekir complete.txt, aksi takdirde dosyayı işe yaramadı.


5
Bu da işe yarayacaktır, ancak argümanlarını kullanabiliyorsanız for-loop ihtiyacını göremiyorum cat.
gertvdijk

1
Evet, elbette haklısın. Sadece üzücü siparişin kullanıldığından emin değilim cat *.txt. For döngüsü sıralanmalıdır.
phoibos


Evet, aynı kabuk işleyişiyle aynı. forBash'de veya başka bir yerde kullanmanız farketmez .
gertvdijk

4

Birleştirmek istediğiniz dosyalar sona .txtererse, basit tutun:

cat *.txt > combined.txt

Dizin sadece metin dosyaları içeriyorsa, basittir:

cat * > combined.txt

(Bir kere yarattığınızda combined.txt, tekrar yapmanın onu genişlemeye dahil edeceğini *, garip davranışlara yol açacağını unutmayın ).

Dizindeki bazı dosyaları seçmek, diğerlerini seçmek istemiyorsanız, dosya adlarının hangisini istediğinizi ayırt etmenize izin veriyorsa en iyisidir. Olmazsa, hoşunuza gidebilir find. Ama o kadar ileri gitmen gerektiğinden şüpheliyim.


thnx. Kabul edilen cevabın yorumlarına bakarsanız, Sadi tam olarak bir yorumda bulundu. Cevabınız ilk olsaydı sizinki ihtiyacım olan olurdu. benim de bir göz atın: özel menüde eklendi

Geri dönüşünüz için teşekkür ederiz. Evet, şimdi anlıyorum, biraz sakıncalıydı ...
alexis

4

Cipricus tarafından yazılan Thunar özel aksiyon senaryosu da benzer bir Nautilus senaryosu yazmam için bana ilham verdi ve bu soru ve cevap için bu konuya atıfta bulunanlar için yararlı olabileceğini düşündüm. İşte burada:

#!/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 Düzenleme için teşekkürler. Eski sürümde herhangi bir problem yaşamadım (sınırlı test durumlarımla) ve bu geliştirilmiş versiyonda da bir problem görmüyorum. Önceki sürümdeki bir kusurdan dolayı herhangi bir rahatsızlığa neden olduysam özür dilerim.
Sadi

Kusurlu değildi, ama kodun anlaşılmasını zorlaştıran, gereksiz bir döngü içeriyordu.
David Foerster

2

Bu, bu çözümleri Thunar'ın alışkanlıklarına uygun hale getirmekle ilgili bir tamamlayıcı ve diğer cevapların bir varyasyonudur.

Hepsi bu şekilde kullanılamaz, ancak bazıları vardır.

En ilginç olanı seçili dosyaları Thunar'ın bağlam menüsünden birleştirebilmek olacağını düşündüm .

Bu önerdiği ne bir varyasyonu olan Sadi için bir yorum gertvdijk 'ın cevabı :

   cat %N > JoinedFile

Sadece seçilen dosyalar birleştirilecektir. Görünüm koşullarını metin dosyalarıyla kısıtlayın.

görüntü tanımını buraya girin

görüntü tanımını buraya girin


Yorumu bana sorunuma en açık ve en iyi çözümü sunan Sadi'ye özel teşekkürler .

Kabul ettim gertvdijk 'ın cevabı kesin olarak. Sadece Sadi'nin yorumuna vesile olmakla kalmadı, aynı zamanda iyi bir şekilde tartışılan ve tam bir çözüm sunan (CLI okuma becerilerimin biraz üstünde olsa da) başkaları için daha değerli görünüyor.


2

findAyrıca komutu deneyebilirsin ,

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

.txtGeçerli dizinin içindeki dosyaları bulur ve catkurulan her bir dosya için komutu çalıştırır . Sonunda, tüm çıktı dosya adına yönlendirildi file(doğrudan akımın içinde yaratıldı).

Açıklama:

.                  # 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.