Bu neden çalışmıyor? “Ls * .txt | xargs cat> all.txt ”(tüm dosyalar tek bir txt belgesine dönüştürülür)


20

Bu neden çalışmıyor?

ls *.txt | xargs cat > all.txt

(Ben tüm metin dosyalarının içeriğini tek bir 'all.txt' dosyaya katılmak istiyorum.) -Exec ile bulmak da çalışması gerekir, ama gerçekten xargs sözdizimini anlamak istiyorum.

Teşekkürler


1
Gerçi kullanmayan lsbunun için . Eğer gerçekten kullanamıyorsanız, cat *.txt >all.txto printf '%s\0' *.txt | xargs -r0 cat >allzaman mv all all.txtdosyanın kendisine referansta bulunmasını önlemek için ve sonra deneyin .
tripleee

Yanıtlar:


27

ls *.txt | xargs cat >> all.txt

her dosyadan sonra yeniden oluşturmak yerine all.txt dosyasına ekleneceği için biraz daha iyi çalışabilir.

Bu arada, cat *.txt >all.txtaynı zamanda işe yarayacaktı. :-)


6
Cat * .txt> all.txt doğal olarak daha iyidir. Teşekkürler
ajo

1
Ancak, ... | xargs cat >> all.txt veya> all.txt xargs: unmatched single quote ile her zaman hata döndürür ... Bunun nedeni xargs komut olarak her şeyi komut olarak alması mıdır?
ajo

1
Boşluklu dosya adlarınız var mı? Öyleyse, "find / your / path -iname '* .txt' -print0 | xargs -0 cat >> all.txt" gibi bir şey kullanın
Janne Pikkarainen

1
hayır, tüm dosya adı alanlarını değiştirdim . Ancak bunu düşünürsek, bazı dosya adları list_O'Connor .txt dosyasında olduğu gibi tek tırnak işareti içeriyor olabilir, bu sorun olabilir!
ajo

Evet, sorun o zaman. :) En kolay ve en kolay yol, bulgayı xargs -0 ile birlikte -print0 ile birlikte kullanmaktır - o zaman tüm zincir NULL karakteri ayırıcı olarak kullanır ve boşluk ve özel karakterler otomatik olarak halledilir.
Janne Pikkarainen

3

Dosya adlarınızdan bazıları ', "içeriyorsa veya ayırıcı sorunuxargs nedeniyle boşluk başarısız olursa

Genel xargsolarak -0 olmadan asla geri gelip bir gün sizi ısırır.

Bunun yerine GNU Paralel kullanmayı düşünün:

ls *.txt | parallel cat > tmp/all.txt

veya isterseniz:

ls *.txt | parallel cat >> tmp/all.txt

GNU Paralel hakkında daha fazla bilgi edinin http://www.youtube.com/watch?v=OpaiGYxkSuQ


1

all.txt aynı dizindeki bir dosya olduğundan, aynı dosyadan aynı dosyaya yazmak istediğinde kedi karışır.

Diğer yandan:

ls *.txt | xargs cat > tmp/all.txt

Bu, geçerli dizininizdeki metin dosyalarından bir alt dizindeki all.txt dosyasına (dahil değildir *.txt) okunacaktır .


Yine de aşağıdaki hata: xargs: eşsiz tek tırnak; -0 seçeneğini kullanmazsanız, varsayılan olarak tırnak işaretleri xargs'a özeldir
ajo

1
Adında tek tırnak içeren bir .txt dosyanız var mı?
Jeremy Smyth

0

Komut satırı uzunluğu sınırlamasıyla da karşılaşabilirsiniz. Kullanım nedeninin bir kısmı xargs, girdiyi güvenli komut satırı boyutundaki parçalara ayırmasıdır. Bu nedenle, dizinde yüz binlerce .txt dosyanızın olduğunu düşünün. ls *.txtbaşarısız olur. Yapmanız gerekecek

ls | grep .txt$ |xargs cat > /some/other/path/all.txt

.txt$Bu durumda, .txt ile biten her şeyle eşleşen normal bir ifadedir (bu nedenle *.txt, tam olarak aynı değildir , çünkü adlı bir dosyanız varsa atxt, *.txteşleşmez, ancak normal ifade olur.)

Başka bir yolun kullanılması, diğer yanıtların işaret ettiği gibi, all.txt öğesinin desenle eşleştirilmesidir, *.txtböylece girdi ve çıktı arasında bir çakışma olacaktır.

'Adlarında herhangi bir dosya varsa (ve bu unmatched single quotehatanın nedeni olabilir ),

ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt

--Null seçeneği grep'e çıktıyı \0varsayılan satırsonu yerine (aka null) karakterle ayrılmış olarak kullanmasını söyler ve -0xargs seçeneği de girdisinin aynı biçimde olmasını beklemesini söyler. İçinde yeni satırları olan dosya adları olsa bile bu işe yarar.

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.