Kullanarak bir dizini dönüştürmek zorunda dos2unix. Bunu nasıl yapacağımı anlayamıyorum.
Kullanarak bir dizini dönüştürmek zorunda dos2unix. Bunu nasıl yapacağımı anlayamıyorum.
Yanıtlar:
find . -type f -print0 | xargs -0 dos2unix
Geçerli dizindeki tüm dosyaları özyinelemeli olarak bulur ve bu dosyaları çağırır dos2unix komutu
\;; echo Hello
findçağırma bu kontrolü yapmaz (her ne kadar eklemek için yeterince basit olsa da), ancak modern dos2unixikili dosyaları doğru atlar.
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.
nbir ya da iki büyüklükte
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
dos2unix? Gerçekten merak ediyorum.
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.
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.
dos2unixargümanların genişlemesini etkileyen bir çeşit takma adınız olması. type dos2unixSisteminizin çıktısı nedir ?
**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 ** **/.***/.*...
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 **.
**ima edilen şey hakkında tamamen yanlış bir fikrim vardı ve echobunu açıklığa kavuşturmak.
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
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 {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
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.
Alt dizin yoksa,
ls | xargs -I {} dos2unix "{}"
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 .)
find . -type f -print0 | xargs -0 dos2unixbence problemi çözerdi.