8

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

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

ただし、「usage」出力が表示され続けます。問題は、新しいファイルの名前(fname)が正しく割り当てられていないことだと思います。

4

4 に答える 4

8

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

dos2unix /tmp/testFiles/*.xml

再帰が必要でない限り、必要なのはこれだけです。

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

(GNU検索用)

于 2012-07-02T11:31:11.597 に答える
2

すべてのファイルが1つのディレクトリにある場合(再帰は必要ありません)、ほぼそこにあります。

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

デフォルトdos2unixでは、その場で変換し、元のファイルを上書きする必要があります。

再帰が必要な場合はfind、以下も使用する必要があります。

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

.xmlこれは、で終わるすべてのファイル/tmp/testFiles/とそのすべてのサブディレクトリで機能します。

他の手順が必要ない場合は、シェルループを完全にスキップできます。

非再帰的:

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

そして再帰的に:

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

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

于 2012-07-02T11:22:25.413 に答える
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 s@testFiles/@testFiles/converted/@)
done

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

構文( Rush${f/testFiles\//testFiles\/converted\/}のおかげで)またはファイル名の前に追加するためにここで使用されます:sedconverted/

$ echo /tmp/testFiles/1.xml | sed s@testFiles/@testFiles/converted/@
/tmp/testFiles/converted/1.xml
于 2012-07-02T10:43:09.563 に答える
-1

使用しているdos2unixの実装が明確ではありません。実装が異なれば、必要な引数も異なります。周りには多くの異なる実装があります。

RedHat / Fedora / Suse Linuxでは、次のように入力できます。

    dos2unix /tmp/testFiles/*.xml

SunOSでは、入力ファイル名と出力ファイル名を指定する必要があり、上記のコマンドはいくつかのファイルを破壊します。

于 2012-12-23T09:31:08.353 に答える