2012-07-02 3 views
6

私はdos2unixコマンドを実行する必要があるディレクトリにxmlファイルをたくさん持っており、新しいファイルが頻繁に追加されます。私は手動で毎回各ファイルに対してdos2unixコマンドを実行するのではなく、スクリプトですべてを自動化したいと思っています。私はいくつかのチュートリアルで読んだものから、私も私の人生の中でシェルスクリプトを見たことがないが、これまでのところ、私はこれを持っている:シェルスクリプトを使ってdos2unixを自動化するには?

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

は、しかし、私は「使用法」の出力が現れてきておきます。問題は私が新しいファイルの名前(fname)を正しく割り当てていないことだと思います。誰も助けることができます。

おかげで、 アラン

答えて

6

使用メッセージが表示されるのは、dos2unixが提供している余分な引数を取らないということです。ただし、複数のファイル名を受け入れることもできます(グロブ経由でも可能です)。コマンドラインで受け入れる以上のファイルを処理していない限り、ループは必要ありません。

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

(GNUが見つけるために)

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 

結果はconverted/サブディレクトリに保存されます。

建設${f/testFiles\//testFiles\/converted\/}(おかげラッシュに) またはsedは、ファイル名の前にconverted/を追加するために、ここで使用されているすべてのファイルが一つのディレクトリ(不要再帰)である場合

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

ありがとうございましたが、あなたはこれが何をするか説明することができます: "$($ Fをエコー| sedのS @ TESTFILES/@ TESTFILES /変換/)" の編集:このコマンドは動作しません。エラー:sed:コマンドが文字化けする:s @ testFiles/@ testFiles/converted /、sedコマンドを削除するとエラーが発生する:入力ファイルを開いていないファイル –

+0

ファイルの名前の前に 'converted /'を追加するだけです。 –

+2

これに 'sed'は必要ありません。 '$ {f/testFiles \/testFiles \/converted \ /} 'で行うことができます。 – rush

2

その後、あなたはほとんどそこにいます。

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

デフォルトでは、dos2unixは元の場所に変換して上書きする必要があります。

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

/tmp/testFiles/とそのサブディレクトリのすべてに.xmlで終わるすべてのファイルで作業しますどの:再帰が必要な場合は

あなたにもfindを使用する必要があります。

他のステップは、あなたが完全にシェルループスキップすることができます必要とされていない場合:私は見るあなたの元のコマンドでは

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

非再帰:

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

再帰のためにあなたは各ファイル名のベース名を見つけ、それをdos2unixに渡そうとしていますが、あなたの意図ははっきりしていません。後で、コメントの中で、ファイルを上書きするだけだと言います。私のソリューションは変換を実行し、バックアップは作成せず、変換されたバージョンで元のものを上書きします。私はこれがあなたの意図だったことを願っています。

+1

彼は拡張されたグロブの結果を保存していません。代入時にグロブは展開されません。 –

+0

@DennisWilliamson:あなたが正しいと思う。このコメントを削除しました。訂正していただきありがとうございます。 – Sorpigal

0

あなたが使用しているDOS2UNIXの実装は明らかではありません。

dos2unix /tmp/testFiles/*.xml 

あなたは再帰を必要としない限り、あなたが必要とするすべてであるべき。異なる実装には異なる引数が必要です。周囲にはさまざまな実装があります。

のRedHat/Fedoraの/ SUSE LINUXでは、あなたはちょうどあなたが入力と出力ファイル名を与えるために必要とされるのSunOSで

dos2unix /tmp/testFiles/*.xml 

を入力でき、上記のコマンドは、ファイルのいくつかを破壊してしまうであろう。

どのバージョンをお使いですか?

に関して、 アーウィン

関連する問題