35

タイピングと同じ効果を達成しようとしています

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/  

コマンドラインで、bash スクリプト内から。私は持っている:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

これを実行すると、予期しないエラーが発生します。

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory

mv実際に目的の展開を行うために、これらすべてを引用する正しい方法は何ですか? (はい、 のパターンに一致するファイルはたくさんあります./images/。)

4

3 に答える 3

36

削除された回答は正しい軌道に乗っていました。あなたの試みへのわずかな変更:

shopt -s extglob
MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='@(pdf|eps|jpg|svg)'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

ブレース展開は変数展開の前に行われますが、変数展開はパス名展開の前に行われます。したがって、元の変数が展開されている場合、中括弧はまだ中括弧ですが、代わりに変数にパス名要素が含まれている場合、パス名の展開が完了すると、それらは既に展開されています。

于 2011-01-14T17:18:14.953 に答える
9

次のように機能させるには、その行を評価する必要があります。

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
eval "mv \"$MYDIR\"/*.$SUFFIXES \"$OTHERDIR/\""

さて、これには問題があります。特に、信頼できない場合$SUFFIXESは、インジェクション攻撃が含まれている可能性がありますが、この単純なケースでは問題ありません。

他の解決策を受け入れる場合は、とを試してみることをお勧めしfindますxargs

于 2011-01-14T14:23:40.847 に答える