4

私の質問は、cpを使用して別のディレクトリから複数のファイルをコピーする方法と非常によく似ていますか?

明示的なループは使いたくありません。これが私がすることです:

$ FILES_TOOLS="fastboot,fastboot-HW.sh"
$ cp $HOME/tools/{$FILES_TOOLS} $TOP_DIR/removeme
cp: cannot stat `/home/johndoe/tools/{fastboot,fastboot-HW.sh}': No such file or directory

次の理由により、ファイルが存在し、宛先が有効です。

$ cp $HOME/tools/{fastboot,fastboot-HW.sh} $TOP_DIR/removeme
$ echo $?
0
  • FILES_TOOLSから二重引用符を削除しようとしましたが、うまくいきませんでした。
  • 引用と二重引用を試みました{...}、運がありません
  • 角かっこをバックスラッシュしようとしましたが、運がありません
  • これは、シェルの拡張が実際に発生するときの問題だと思います。
4

3 に答える 3

2

この答えはbashに限定されています。

コマンドの前にを付けて、コマンドがechoどのようになるかを確認します。cp

echo cp $HOME/tools/{$FILES_TOOLS} $TOP_DIR/removeme

evalそれを機能させるには、サブシェルの内側に挿入する必要があります。

cp $( eval echo $HOME/tools/{$FILES_TOOLS} ) $TOP_DIR/removeme
于 2013-02-08T22:24:34.797 に答える
1

これは、シェルの拡張が実際に発生するときの問題だと思います。

はい。シェルが異なれば、変数の拡張に関連するブレースの拡張に関するルールも異なります。あなたのやり方はkshで機能しますが、zshやbashでは機能しません。{1..$n}kshとzshで動作しますが、bashでは動作しません。bashでは、変数の展開は常にブレースの展開後に発生します。

bashでこれに最も近いのはeval。です。

于 2013-02-08T22:23:18.813 に答える
1

中括弧の内容がリテラルである限り、中括弧の展開を使用して、コピーするファイルのフルパス名を配列に入力してから、cpコマンドで配列の内容を展開できます。

$ FILES_TOOLS=( $HOME/tools/{fastboot,fastboot-HW.sh} )
$ cp "${FILES_TOOLS[@]}" $TOP_DIR/removeme

更新:変数にベース名だけを含める理由があるかもしれないことに気づきました。明示的なループなしで、配列の各要素にパスのプレフィックスを付けることができる別の配列ベースのソリューションを次に示します。

$ FILES_TOOLS=( fastboot fastboot-HW.sh )
$ cp "${FILES_TOOLS[@]/#/$HOME/tools/}" $TOP_DIR/removeme

この場合、パターン置換演算子を使用して、各配列要素の先頭にある空の文字列をディレクトリ名に置き換えます。

于 2013-02-09T00:04:04.417 に答える