Dosyaları böldükten sonra tekrar katılmanın en iyi yolu nedir?


73

Büyük bir dosyam varsa ve 100 megabaytlık parçalara bölmem gerekirse, yapacağım

split -b 100m myImage.iso

Bu genellikle bana gibi bir şey verir

xaa
xab
xac
xad

Onları tekrar bir araya getirmek için kullanıyorum

cat x* > myImage.iso

Görünüşe göre, bir dosya grubundaki her kod satırını okumaktan catve çıktıyı yeni bir dosyaya yönlendirmekten daha etkili bir yol olmalı . Sadece iki dosyayı açmanın, EOFişaretçiyi birinciden kaldırmanın ve birleştirmenin bir yolu gibi - tüm içeriğe bakmak zorunda kalmadan.

Windows / DOS, ikili dosyalar için bir copy komutuna sahiptir. Yardım, bu komutun birden fazla dosyayı birleştirebilecek şekilde tasarlandığından bahseder. Bu sözdizimi ile çalışır: ( /bikili mod içindir)

copy /b file1 + file2 + file3 outputfile

Linux'ta büyük dosyalara katılmak için kediden daha benzer veya daha iyi bir yol var mı?

Güncelleme

catAslında dosyalara katılmanın doğru ve en iyi yolu bu gibi görünüyor . Baştan beri doğru komutu kullandığımı bilmek sevindim :) Geri bildiriminiz için herkese teşekkürler.


22
Yan not: Daha iyi kullanmayın cat x*, çünkü dosyaların sırası yerel ayarlarınıza bağlıdır. Daha iyi yazmaya başlayın cat xbasın yerine, Esc ve ardından *- dosyaların genişletilmiş sırasını görürsünüz ve yeniden düzenleyebilirsiniz.
rozcietrzewiacz 15:11

16
Bunun yerine , belirtilen sırayı xaa xab xac xad xae xaf xagcat x*cat xa{a..g}cat
Peter.O için 15:11

3
@rozcietrzewiacz - yerel ayarımı nasıl bozacağımı örnek olarak verebilir misiniz cat x*? Yeni yerel ayarı da etkilemeyeceği spliteğer o kadar splitve cat x*aynı sistemde kullanıldı her zaman işe yarar?
cwd

3
"iki dosyayı açmak, EOF işaretçisini ilkinden çıkarmak ve bunları bağlamak - tüm içeriğe
bakmak

6
@cwd: bakıldığında split.cGNU coreutils içerisinde, ekleri karakter sabit diziden inşa edilir: static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";. Son ek yerel ayarlardan etkilenmez. (Ama herhangi bir aklı başında yerel ayarın küçük harfleri yeniden sıralayacağını sanmıyorum; EBCDIC bile standart sıralarını koruyor.)
Keith Thompson

Yanıtlar:


50

Sadece catbunun için yapıldı. En eski GNU araçlarından biri olduğundan, bence diğer araçların bunu daha hızlı / daha iyi yapması pek olası değildir. Ve bu borular değil - yalnızca çıktıyı yönlendiriyor.


cat x, then press EscBahsettiğiniz hile düzgün .. böyle bir şey, teşekkür ... İyi yorumun ve iyi cevap arıyordum
Peter.O

2
Bir şey değil :) Ayrıca, komut satırındaki o dosya listesine sahipseniz, Ctrl+Wbir kelimeyi kesmek ve daha sonra Ctrl+Yyapıştırmak için kullanabilirsiniz.
rozcietrzewiacz 15:11

kedi "bitiştirmek" anlamına geliyor
JoelFan 15:11

4
.. ve "catenate" Latince bir kelime olan "catena" kelimesini "zincir" anlamına gelir. bitiştirmek , bir zincirin bağlantılarını birleştirmektir. ... (ve biraz daha konu dışı, bir katener eğrisi de "catena" dan ayrılır. Bu bir zincirin
sarkma şeklidir

19

Kaputun altında

İlk dosyayı kopyalamaktan, daha sonra ikinci dosyayı kopyalamaktan vb. Daha etkili bir yol yoktur. Hem DOS copyhem catde bunu yapın.

Her dosya diskteki diğer dosyalardan bağımsız olarak depolanır. Disk benzeri bir cihazda veri depolamak için tasarlanan hemen hemen her dosya sistemi bloklarla çalışır. İşte ne olduğu hakkında oldukça basitleştirilmiş bir sunum: disk 1kB, yani bloklara bölünmüş ve her dosya için işletim sistemi onu oluşturan blokların listesini saklar. Çoğu dosya bir tamsayı bloğu uzunluğunda değildir, bu nedenle son blok sadece kısmen doludur. Uygulamada, dosya sistemleri son kısmi bloğu birkaç dosya arasında paylaşmak veya “blok 46798, blok 46799,…” yerine “blok 46798 - 47913” depolamak gibi birçok optimizasyona sahiptir. İşletim sisteminin yeni bir dosya oluşturması gerektiğinde, boş blokları arar. Bloklar ardışık olmak zorunda değildir: sadece 4, 5, 98 ve 178 blokları serbestse, hala bir 4kB dosyasını saklayabilirsiniz.

Dosyaların ortasındaki kısmi blokları destekleyebilirsiniz, ancak bu, özellikle dosyalara sıralı olmayan bir şekilde erişirken oldukça karmaşıklık sağlar: 10340. bayta atlamak için, artık 11. bloğun 100. baytına atlayamazsınız. Her araya giren bloğun uzunluğunu kontrol etmek için.

Blok kullanımı göz önüne alındığında, sadece iki dosyaya katılamazsınız, çünkü genel olarak ilk dosya bloğun ortasında biter. Elbette, özel bir durum olabilir, ancak birleştirirken her iki dosyayı da silmek istiyorsanız. Bu nadir bir işlem için oldukça spesifik bir işlemdir. Bu tür özel işlemler kendi başına yaşamaz, çünkü tipik bir dosya sisteminde, birçok dosyaya aynı anda erişilir. Öyleyse, bir optimizasyon eklemek istiyorsanız, dikkatlice düşünmeniz gerekir: Başka bir işlem söz konusu dosyalardan birini okuyorsa ne olur? Birisi A ve C'yi birleştirirken biri A ve B'yi birleştirmeye çalışırsa ne olur? Ve bunun gibi. Sonuçta, bu nadir optimizasyon çok büyük bir yük olacaktır.

Sonuç olarak, başka yerlerde büyük fedakarlıklar yapmadan dosyalara katılmayı daha verimli hale getiremezsiniz. Buna değmez.

Bölme ve katılma

splitve catdosyaları bölmenin ve birleştirmenin basit yoludur. katılmak için işe yarar split, böylece alfabetik sıraya göre adlandırılmış dosyaları üreten ilgilenir cat *.

Katılmanın bir dezavantajı, catortak arıza modlarına karşı dayanıklı olmamasıdır. Dosyalardan biri kesilirse veya kaybolursa, catşikayet etmeyecek, yalnızca hasarlı çıktı alacaksınız.

zipsplitVe gibi çok parçalı arşivler üreten sıkıştırma yardımcı programları vardır rar -v. Çok unixy değildirler, çünkü bölünmeye ek olarak sıkıştırırlar ve paketlerler (birden fazla dosyayı bir araya getirirler) (ve buna ek olarak birleştirmeye ek olarak sıkıştırmalar açılır ve açılırlar). Ancak tüm parçalara sahip olduğunuzu ve parçaların eksiksiz olduğunu doğrulamanız açısından faydalıdırlar.


8

Görünüşe göre, tüm içerikleri sistem stdin/ cihaz aracılığıyla yayınlamaktan daha etkili bir yol olmalıstdout

Tabii ki olan bu değil. Kabuk stdout'u cat doğrudan açık dosyaya bağlar, yani "stdout'tan geçmek" diske yazmakla aynıdır.


Konsolda birkaç gigabaytlık kod görüntülemek için cat kullandığını, sonra yakalayıp bir dosyaya koyduğunu hayal ediyordum. Bu, kedi kullandığımda ve göremediğim çıktıları yönlendirdiğimde ne olması gerektiğine dair sahip olduğum zihinsel imge. İki dosyayı açmanın, bağlanmanın ve daha sonra onları kapatmanın tüm kod satırlarını çalıştırmaktan daha etkili olacağını düşünmek gibiydi cat. Doğrudan bağlantı hakkında beni bilgilendirdiğiniz için teşekkür ederiz.
cwd

@cwd Bu şekilde iki dosyaya katılabileceğiniz bir dosya sistemi tasarlamak mümkün olacaktı, ancak bu dosya sisteminin tasarımını çok zorlaştırıyordu. Çok sayıda ortak işi daha karmaşık ve daha yavaş hale getirme pahasına, bu işlem için optimizasyon yaparsınız.
Gilles

@Gilles - düşük seviye detayları hakkında daha fazla şey bilmek ilginç olurdu. Bana göre, birkaç diske ait tüm sektörleri sabit diskten okumak ve daha sonra bunları diskteki kullanılmayan sektörlere geri bırakmak yetersiz kalıyor. Ve büyük dosyaların zaman zaman birden fazla serbest sektör bloğu arasında depolanması gerektiğini düşünüyorum çünkü bunları saklamak için her zaman yan yana yeterli blok olmayabilir. Bu nedenle, teorik olarak EOF işaretleyiciyi kaldırarak ve bir sonraki dosyanın başında sektör grubuna işaret ederek bir dosyaya katılabilirsiniz. * nix güçlüdür, bu yüzden kediden daha iyi bir yol olup olmadığını merak ettim.
cwd

@cwd “EOF marker” yok. Hiçbir mantıklı modern dosya sistemi böyle çalışmaz, çünkü bazı karakterlerin dosyalarda oluşmasını önler (veya karmaşık kodlamalar gerektirir). Fakat bir EOF marker olsa bile, çoğu zaman, ondan sonra doğru dosyaya sahip olamazsınız.
Gilles

Gerçek bir EOF marker değil, EOF marker kavramını kastediyordum. Aksi halde, sabit sürücüdeki bir dosyanın bitlerine ve baytlarına bakarsanız, nerede bittiğini nasıl anlarsınız? Dosyanın başlangıcında uzunluğunu belirler misiniz? Gerçekten düşük seviye bir şeyden bahsediyorum. Bahsettiğiniz şey bu mu?
cwd

3

Bir zamanlar tam olarak bu problemi yaşadım: Bazı dosyalara katılmak istedim, fakat onları iki kat tutacak kadar disk alanım yoktu.

Bu yüzden bir sürü program yazdım:

  • bir dosyayı okuyarak, emzirerek göndererek ve bittiğinde çıkarmasıyla "emmek" için
  • ve biri "anında" verileri tamponlamak için.

Bu benim gibi bir şey yapmamı sağladı

partto sourcefile | mybuffer 128M >>cumufile

ve böylece 128M hala yazılmamışken kaynak dosyanın çıkarılması. Biraz tehlikeli, ancak veriler o kadar değerli değilse veya başka bir yerde de mevcutsa, uygulanabilir.

Gerekirse, kaynağı sağlayabilirim.


0

Teknik olarak konuşursak, bu, içeriğin tamamını okumak ve yazmak zorunda kalmadan tüm dosyaya erişmenin bir yoludur ve büyük dosyalar için ya da az yer kalması durumunda faydalı olabilir:

$ mkfifo myImage.iso
$ cat xa{a..g} > myImage.iso &

Ve sonra kullanın myImage.iso, örneğin

$ md5sum myImage.iso

Tabii ki myImage.isonormal bir dosya değil (pipe adında) özel bir dosya olsa da , bu ne yapmaya çalıştığınıza bağlı olarak faydalı olabilir veya olmayabilir.


0

Bölünen Dosyalar

Boyuta Göre Böl

Büyük dosyayı küçük dosyalara bölmek ve küçük çıktı dosyalarının adını ve boyutunu seçmek istiyorsanız bu yoldur.

split -b 500M videos\BigVideoFile.avi SmallFile.

Bu şekilde, büyük bir dosyayı 500 MB'lık kük parçalara bölmeyi seçersiniz. Ayrıca parça dosyalarının adlarının SmallFile olmasını istersiniz. Dosya adından sonra noktaya ihtiyacınız olduğunu unutmayın . Sonuç şunun gibi yeni dosyalar oluşturmalıdır:

SmallFile.ab SmallFile.ad SmallFile.af SmallFile.ah SmallFile.aj
SmallFile.aa SmallFile.ac SmallFile.ae SmallFile.ag SmallFile.ai SmallFile.ak
...

Satır Sayısına Göre Böl

Bu şekilde, metin dosyasını 50 satırla sınırlı daha küçük dosyalara bölersiniz.

split -l 50 text_to_split.txt

Sonuç şöyle bir şey olmalı:

xaa xab xac ...

Baytlara Göre Böl

Özel boyutlu küçük dosyaların bayt olarak küçük dosyalara bölünmesi:

split -b 2048 BigFile.mp4

Sonuç Satır Sayısına Göre Ayrılma sonucuna benzer olmalıdır .

Katılan Dosyalar

Dosyaları iki yolla birleştirebilirsiniz. Birincisi:

cat SmallFile.* > OutputBigVideoFile.avi

veya:

cat SmallFile.?? > OutputBigVideoFile.avi

Not: Dosyalara katılırken küçük dosyalar zarar görmemelidir. Ayrıca tüm küçük (parça) dosyalar aynı dizinde olmalıdır.

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.