2012-07-02 18 views
6

Bir dizinde, dos2unix komutunun üzerinde gerçekleştirilmesi gereken bir dizi xml dosyası var ve her sık ​​sık yeni dosyalar eklenecektir. Her dosyada her seferinde dos2unix komutunu manuel olarak gerçekleştirmek yerine, bir betik ile otomatikleştirmek istiyorum. Birkaç eğiticiler üzerinde ne okudum ben bile hayatımda bir kabuk komut dosyası bakmadım ama bugüne kadar bu var:Kabuk betiğini kullanarak dos2unix nasıl otomatikleştirilir?

FILES=/tmp/testFiles/* 
for f in $FILES 
do 
    fname=`basename $f` 
    dos2unix *.xml $f $fname 
done 

Ancak 'Kullanım' çıkışı gösterilmesini almaya devam. Sorun şu ki, yeni dosyanın adını doğru olarak atamadım (fname). Biri yardım edebilir mi.

sayesinde Alan

cevap

6

Kullanım iletisini almanızın nedeni, dos2unix'un sağladığınız ek argümanları almamasıdır. Bununla birlikte, birden fazla dosya ismini (aynı zamanda globlar aracılığıyla) kabul edecektir. Komut satırında kabul edilenden daha fazla dosya işlenmedikçe bir döngüye ihtiyacınız yoktur.

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

(GNU için bulmak)

1
mkdir /tmp/testFiles/converted/ 
for f in /tmp/testFiles/*.xml 
do 
    fname=`basename $f` 
    dos2unix $f ${f/testFiles\//testFiles\/converted\/} 
    # or for pure sh: 
    # dos2unix $f $(echo $f | sed [email protected]/@testFiles/converted/@) 
done 

sonuç converted/ alt dizininde kaydedilecektir.

inşaat ${f/testFiles\//testFiles\/converted\/} (teşekkürler Rush ile) veya sed dosyanın adından önce converted/ eklemek için buraya kullanılır: tüm dosyalar tek bir dizinde (gerekli Yinelemesiz) iseniz

$ echo /tmp/testFiles/1.xml | sed [email protected]/@testFiles/converted/@ 
/tmp/testFiles/converted/1.xml 
+0

teşekkür ederim ama bu ne açıklayabiliriz: | Edit "$ (echo $ f s @ testFiles/@ testFiles/dönüştürülmüş/sed)": Bu komut çalışmaz. Hata: sed: komut garbled: s @ testFiles/@ testFiles/converted /, sed komutu çıkarma hatası veriyor: Giriş dosyası açılamadı FILES –

+0

Sadece bu dosya isminden önce 'converted /' ekledim. –

+2

Bunun için 'sed' gerekmez. Bunu, $ {f/testFiles \ // testFiles \/converted \ /} ' – rush

2

sonra neredeyse oradasın. Varsayılan dos2unix olarak

for file in /tmp/testFiles/*.xml ; do 
    dos2unix "$file" 
done 

yerinde dönüştürmek ve orijinali üzerine olmalıdır. özyineleme gerekiyorsa

siz de find kullanmak gerekecektir:

find /tmp/testFiles -name '*.xml' -print0 | while IFS= read -d '' file ; do 
    dos2unix "$file" 
done 

/tmp/testFiles/ içinde .xml ve alt dizinleri tüm ile biten tüm dosyalar üzerinde çalışacak Hangi.

başka hiçbir adım tamamen kabuk döngü atlayabilirsiniz gerekiyorsa: Anlıyorum Orijinal komutta

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

:

Sigara özyinelemeli:

find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} + 

Ve özyinelemeli için Her bir dosya adının taban adını bulup bunu dos2unix'a aktarmaya çalışıyorsunuz, ancak amacınız net değil. Daha sonra, bir yorumda, sadece dosyaların üzerine yazmak istediğinizi söylüyorsunuz. Çözümüm, dönüşümü gerçekleştirir, yedek oluşturmaz ve orijinali dönüştürülen sürümle üzerine yazar. Umarım bu senin niyetin.

+1

Genişleyen bir glob'un sonuçlarını saklamayor. Küre görevlendirmede genişlemiyor. –

+0

@DennisWilliamson: Doğru olduğunu görüyorum. Bu yorumu kaldırdım, düzeltme için teşekkürler. – Sorpigal

0

O kullandığınız dos2unix hangi uygulama açık değildir:

dos2unix /tmp/testFiles/*.xml 

çağırmayı bir gerekmedikçe tüm ihtiyaç olmalı. Farklı uygulamalar farklı argümanlar gerektirir. Etrafında birçok farklı uygulama var.

RedHat/Fedora/Suse Linux üzerinde sadece bir giriş ve çıkış dosya adını vermek zorundadır SunOS üzerinde

dos2unix /tmp/testFiles/*.xml 

yazabilirsiniz ve yukarıdaki komutu çeşitli dosya yok edecektir.

Hangi sürümü kullanıyorsunuz?

Saygılarımızla, Erwin

İlgili konular