Dos2unix'i tüm bir dizinde nasıl çalıştırabilirim? [kapalı]


Yanıtlar:


591

find . -type f -print0 | xargs -0 dos2unix

Geçerli dizindeki tüm dosyaları özyinelemeli olarak bulur ve bu dosyaları çağırır dos2unix komutu


94
Dosya adında boşluklar olsaydı kırılırdı. find . -type f -print0 | xargs -0 dos2unixbence problemi çözerdi.
Noufal Ibrahim

1
bu buluntuyu verdim. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src ve hata bulma hatası verdi: -exec için eksik argüman
Vivek Gaur

1
Noktalı virgülten kaçan ters eğik çizginin dos2unix komutlarının noktalı virgüllerle ayrılmasını sağladığını ve böylece birlikte ezilmediklerini unutmayın. Başka bir komutu çalıştırmak isterseniz sonradan Başka bir noktalı virgül gereksinim böylece edeceğiz\;; echo Hello
Josh

1
Ancak bu komutla dikkatli olun, dosyanın dönüştürmeye ihtiyacı olup olmadığını kontrol etmez, bu nedenle ikili dosyalar bile "dönüştürülecek" ve bozulacaktır.
vguzmanp

2
@vguzmanp Doğru, findçağırma bu kontrolü yapmaz (her ne kadar eklemek için yeterince basit olsa da), ancak modern dos2unixikili dosyaları doğru atlar.
Kyle Strand

68

Büyük bir dizinse, birden fazla işlemciyle çalışmayı düşünebilirsiniz:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

Bu bir seferde 1 dosya geçirecek ve 4 işlemci kullanacaktır.


1
Bu yöntemin avantajı vardır, dos2unix herhangi bir sorunla karşılaşsa bile devam eder! "--Force" yöntemi gibi bir şey. Bunun için teşekkür ederim!
freeo

Vay canına - Yatak yanlış eklenmiş bir Windows geliştiricileri kod eklemelerini dönüştürmeye çalışırken bana bir çok problem çözme zamanı kazandırdı. Teşekkür ederim!!
NetYeti

1
Her bir dosya için yeni bir dos2unix işleminin başlatılması büyük ölçüde gereksiz ek yük getirecektir. Bunu nbir ya da iki büyüklükte
çarpacağım (

25

Dos2unix'ten kötü bir şekilde memnun olduğum için, kendi basit yardımcı programımı kullanıma sundum. Hız ve öngörülebilirlikte birkaç avantajın yanı sıra, sözdizimi de biraz daha basittir:

endlines unix *

Ve alt dizinlere inmesini istiyorsanız (gizli dizinleri ve metin olmayan dosyaları atlamak):

endlines unix -r .

endlinesburadan ulaşabilirsiniz https://github.com/mdolidon/endlines


1
Bu harika! Buna ulaşabileceğim en yakın tek astar burada: unix.stackexchange.com/a/365679/112190
phyatt

2
Nasıl gelişir dos2unix? Gerçekten merak ediyorum.
Walf

3
1 / Temel olarak, dos2unixfarklı yeteneklere sahip tonlarca farklı vardır (bazıları UTF32'yi okurken bazıları okumaz; bitiş çizgileri değil). endlinesYetenekleri iyi bilinen sadece bir tane var . 2 / girişte liberal, hepsi değil dos2unix. 3 / etkin dosya ağacı keşfi, on binlerce dosyada hızlı ve pratik olacak şekilde tasarlanmıştır. 4 / OSX'te kutudan çıkar - Brew paketinin mevcut olması artık daha az önemlidir.
Mathias Dolidon

1
Benim durumumda çok teşekkürler. Açık olan özellikler, bir dizin ağacını işlemenin kolay yolu ve hızlı yürütme süresidir.
AlSavi

17

Bu gibi gizli dosya ve klasörleri, atlamak en iyisi .git.kullanmak yerine So findsizin eğer bashversiyon son yeterlidir veya kullandığınız takdirde zsh, sadece yapın:

dos2unix **

Bash için bunun gerekeceğini unutmayın:

shopt -s globstar

.... ama bu dürüstçe .bashrcyine de koymak gerekir yeterince yararlı bir özelliktir .

Eğer varsa yok gizli dosyaları ve klasörleri atlamak istiyorum, ama yine de uğraşmak istemiyorum find(ve seni suçlayamam), eşleşmesini ikinci özyinelemeli-glob argüman sağlayabilir ancak gizli girdileri:

dos2unix ** **/.*

Her iki durumda da glob'un dizinleri içerecek şekilde genişleyeceğini unutmayın, bu nedenle aşağıdaki uyarıyı göreceksiniz (potansiyel olarak birçok kez): Skipping <dir>, not a regular file.


1
Bu benim için işe yaramadı. Globstar sözdizimi dos2unix için çalışır mı? Globstar'ı başka bir yerde başarıyla kullandım, ancak işe yaramadı. Bash 4.3.11'i kullanıyorum (1)
NS du Toit

@NSduToit * NIX stili kabuklar yürütülebilir dosyaların argüman genişletme davranışını değiştirmesine izin vermez, çünkü (Windows'tan farklı olarak) argüman genişletme yürütülebilir dosya argümanları almadan önce gerçekleştirilir. Aklıma gelen tek şey, dos2unixargümanların genişlemesini etkileyen bir çeşit takma adınız olması. type dos2unixSisteminizin çıktısı nedir ?
Kyle Strand

1
@NSduToit Burada bir karışıklık var. Benim cevabım açıkça belirtmektedir noktası kullanmanın **yerine find"gibi gizli dosya ve klasörleri, atlamak etmektir .git". dos2unixgizli dosyaları asla görmez, çünkü **onları göstermek için genişlemez. Eğer varsa istediğiniz otomatik olarak çalışacak şekilde dos2unixgizli dosya ve klasörler üzerinde kullanabileceğiniz findveya genişleyecektir sadece gizli dosya ve klasörleri dahil (kök dir), Geçerli klasördeki (üst dir) ve diğer gizli girdileri. dos2unix ** **/.***/.*...
Kyle Strand

1
( Bir dizinde çalıştırıldığında dos2unixyazdırabileceğini unutmayın Skipping <dir>, not a regular file., bu yüzden çalışır durumda ..ve .güvenlidir.) Ayrıca, lsbir glob ile birleştirmek globun nasıl genişletildiğini kontrol etmek için iyi bir yol değildir ; kullanmak echoyerine: echo **argümanlar yazdırır dos2unixaldığı dos2unix **.
Kyle Strand

1
Teşekkür ederim! Mantıklı! Tamam, **ima edilen şey hakkında tamamen yanlış bir fikrim vardı ve echobunu açıklığa kavuşturmak.
NS du Toit

7

Yaygın bir kullanım durumu , Git deposuna kaydedilen tüm dosyalar için satır sonlarını standartlaştırmak gibi görünmektedir :

git ls-files | xargs dos2unix

Belirli dosyaları (örn unutmayın *.sln, *.bat) vb vardır sadece , Windows işletim sistemlerinde kullanılan ve gerektiği tutmakCRLF biten:

git ls-files '*.sln' '*.bat' | xargs unix2dos

Gerekirse kullanın .gitattributes


6

Herhangi bir Solaris kullanıcısı için (5.10 kullanıyorum, daha yeni sürümler ve diğer unix sistemleri için de geçerli olabilir):

dos2unix dosyanın üzerine yazma varsayılanı değildir, sadece güncellenmiş sürümü stdout'a yazdırır, bu nedenle kaynak ve hedefi, yani aynı adı iki kez belirtmeniz gerekir:

find . -type f -exec dos2unix {} {} \;

2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done

1
Stack Overflow'a hoş geldiniz. Çözümünüz geçerli bir çözüm olsa da, buna bir açıklama ekleyebilmeniz harika olur. Cevabınızı haklı çıkarmak için diğer cevaplara da başvurmayı düşünebilirsiniz. Daha fazla bilgi için lütfen Nasıl Yanıtlanacağına bakın.
kvantour

2

Aynı sorunu yaşadım ve buradaki mesajlar sayesinde çözdüm. Yüze yakın dosyam olduğunu biliyordum ve sadece * .js dosyaları için çalıştırmam gerekiyordu. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Yardımlarınız için hepinize teşekkürler.



0

Bunu milyonlarca kez googledim, bu yüzden benim çözümüm bu bash fonksiyonunu ortamınıza koymak.

.bashrcveya .profileveya her neyse

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

kullanım

$ dos2unixd ./somepath

Bu şekilde orijinal komuta sahip olursunuz dos2unixve bunu hatırlamak kolaydır dos2unixd.


-1

Alt dizin yoksa,

ls | xargs -I {} dos2unix "{}"

4
Alt dizin yoksa dos2unix *, daha basittir ve aslında bundan daha sağlam olacaktır. (Genellikle lsbir biçimlendirme aracı olduğu ve *programlı kullanım için daha güvenilir olduğu için çıktısının borulanması önerilmez .)
Kyle Strand

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.