2012-07-02 28 views
6

Mam kilka plików xml w katalogu, który musi mieć wykonane polecenie dos2unix i nowe pliki będą dodawane co jakiś czas. I Zamiast ręcznego wykonywania polecenia dos2unix na każdym pliku za każdym razem chciałbym zautomatyzować wszystko za pomocą skryptu. I nigdy nawet nie spojrzał na skrypcie powłoki w moim życiu, ale do tej pory mam to z tego co czytałem na kilku tutoriali:Jak zautomatyzować dos2unix za pomocą skryptu powłoki?

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

Jednak wciąż otrzymuję wyjście „Wykorzystanie” wyświetlane. Myślę, że problem polega na tym, że nie przypisuję poprawnie nazwy nowego pliku (fname). Czy ktoś może pomóc.

Dzięki, Alan

Odpowiedz

6

Powodem otrzymania komunikatu o użyciu jest to, że dos2unix nie przyjmuje dodatkowych argumentów, które wysyłasz. Przyjmie jednak wiele nazw plików (również za pośrednictwem globów). Nie potrzebujesz pętli, chyba że przetwarzasz więcej plików, niż można zaakceptować w wierszu poleceń.

dos2unix /tmp/testFiles/*.xml 

powinno być wszystko, czego potrzebujesz, chyba że trzeba rekurencji:

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

(dla GNU find)

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 

Wynik zostanie zapisany w podkatalogu converted/.

Budowa ${f/testFiles\//testFiles\/converted\/} (dzięki szczytu) lub sed używany jest tutaj, aby dodać converted/ przed nazwą pliku:

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

Dziękuję ale można wyjaśnić, co to robi: "$ (echo $ f | sed s @ testFiles/@ testFiles/przeliczona /)" Edycja: to polecenie nie działa. Błąd: sed: polecenie zniekształcone: s @ testFiles/@ testFiles/convert /, usunięcie polecenia sed powoduje błąd: nie można otworzyć pliku wejściowego PLIKI –

+0

Po prostu dodaję 'convert /' przed tą nazwą pliku. –

+2

Do tego nie potrzebujesz "sed". Możesz to zrobić za pomocą '$ {f/testFiles \ // testFiles \/convert \ /}' – rush

2

Jeżeli wszystkie pliki w jednym katalogu (nie potrzebne rekurencji), a następnie jesteś prawie na miejscu.

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

Domyślnie dos2unix powinny przekształcić się w miejscu i zastąpić oryginał.

Jeśli potrzebna jest rekurencja będziesz musiał użyć find także:

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

Który będzie działać na wszystkich plików kończących się .xml w /tmp/testFiles/ i wszystkich jego podkatalogów.

Jeżeli żaden inny etap są wymagane można pominąć pętlę powłoki całkowicie:

nierekursywnych:

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

I rekurencyjnej:

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

W swojej oryginalnej polecenia widzę znajdujesz nazwę podstawową każdej nazwy pliku i próbujesz przekazać ją do dos2unix, ale twoja intencja nie jest jasna. Później w komentarzu mówisz, że chcesz tylko zastąpić pliki. Moje rozwiązanie wykonuje konwersję, nie tworzy kopii zapasowych i nadpisuje oryginał w przekonwertowanej wersji. Mam nadzieję, że to był twój zamiar.

+1

Nie zapisuje wyników rozszerzonego globu. Glob nie jest rozszerzony przy zadaniu. –

+0

@DennisWilliamson: Widzę, że masz rację. Usunąłem ten komentarz, dziękuję za poprawkę. – Sorpigal

0

Nie jest jasne, jakie realizacja dos2unix używasz. Różne implementacje wymagają różnych argumentów. Istnieje wiele różnych implementacji.

Na RedHat/Fedora/Suse można po prostu wpisać

dos2unix /tmp/testFiles/*.xml 

Na SunOS masz obowiązek podać nazwę pliku wejściowego i wyjściowego, a powyższe polecenie zniszczy kilku plików.

Która wersja używasz?

pozdrowienia, Erwin

Powiązane problemy