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 dos2unix
ikili 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.
n
bir 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 .
endlines
buradan ulaşabilirsiniz https://github.com/mdolidon/endlines
dos2unix
? Gerçekten merak ediyorum.
dos2unix
farklı yeteneklere sahip tonlarca farklı vardır (bazıları UTF32'yi okurken bazıları okumaz; bitiş çizgileri değil). endlines
Yetenekleri 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 find
sizin eğer bash
versiyon 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 .bashrc
yine 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.
dos2unix
argümanların genişlemesini etkileyen bir çeşit takma adınız olması. type dos2unix
Sisteminizin çıktısı nedir ?
**
yerine find
"gibi gizli dosya ve klasörleri, atlamak etmektir .git
". dos2unix
gizli dosyaları asla görmez, çünkü **
onları göstermek için genişlemez. Eğer varsa istediğiniz otomatik olarak çalışacak şekilde dos2unix
gizli dosya ve klasörler üzerinde kullanabileceğiniz find
veya genişleyecektir sadece gizli dosya ve klasörleri dahil (kök dir), Geçerli klasördeki (üst dir) ve diğer gizli girdileri. dos2unix ** **/.*
**/.*
.
..
dos2unix
yazdırabileceğini unutmayın Skipping <dir>, not a regular file.
, bu yüzden çalışır durumda ..
ve .
güvenlidir.) Ayrıca, ls
bir glob ile birleştirmek globun nasıl genişletildiğini kontrol etmek için iyi bir yol değildir ; kullanmak echo
yerine: echo **
argümanlar yazdırır dos2unix
aldığı dos2unix **
.
**
ima edilen şey hakkında tamamen yanlış bir fikrim vardı ve echo
bunu 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.
.bashrc
veya .profile
veya her neyse
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
kullanım
$ dos2unixd ./somepath
Bu şekilde orijinal komuta sahip olursunuz dos2unix
ve 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 ls
bir 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 dos2unix
bence problemi çözerdi.