1

ソースフォルダには一連のプログラムがありますが、コピー先のUSBドライブにコピーする必要があるのは最新バージョンのみです。

Bashスクリプトから-ディレクトリ内のファイルの最新バージョンを再帰的にコピーすると、式は次のようになります。

f=$(find . -name AdbeRdr\*.exe | sort -n | tail -1)

では、一連のマスクのforループ内でfindを機能させるにはどうすればよいでしょうか。

set1="AdbeRdr\*.exe jre-\*.exe LibreOffice\*.msi"
for m in $set1
do
    echo "m: $m"
    f=$(find . -name $m | sort -n | tail -1)
    echo "f: $f"
    cp $f /media/USB
done

$m正しい値(AdbeRdr * .exeなど)を出力し、$f空で、cp親ディレクトリ全体をコピーします。変数()なしで明示的にマスクを指定するfind . -name AdbeRdr\*.exe | sort -n | tail -1と、最後のファイルが正しく出力されます。

どこが間違っているのですか?また、ファイル名にスペースが含まれている場合、どうすればスペースを処理できますか?

ありがとう!

4

1 に答える 1

2

次のように、要素を保持するために文字列ではなく配列を使用します。

set1=( 'AdbeRdr*.exe' 'jre-*.exe' 'LibreOffice*.msi' )
for m in "${set1[@]}"
do
    echo "m: $m"
    f=$(find . -name "$m" | sort -n | tail -1)
    echo "f: $f"
    cp "$f" /media/USB
done

ファイル名のスペースを処理するには、変数を二重引用符で囲みます。

于 2013-02-20T11:15:09.117 に答える