bashスクリプトやシェルから複数のファイルをコピーする方法を知りたいです。私の言葉は
cp /path/to/source/{file1,file2,file3} /path/to/dest
そして
scp /path/to/source/{file1,file2,file3} user@host:/path/to/dest
うまくいきますが、例えば
#!/bin/sh
scp /path/to/source/{file1,file2,file3} user@host:/path/to/dest
次のエラーが発生します。
/path/to/source/{file1,file2,file3}: No such file or directory
単一のファイルをコピーするか、シェルをコピーする場合に機能するため、問題は複数のファイルです。すべてのファイルに使用したいがすべてコピーしたくない場合*
にも機能します。両方のフォルダーに同じ名前があるが内容が異なるファイルがあるため、選択したファイルのみをコピーする必要があります。したがって、すべてのファイルをコピーしてから不要なファイルを削除することは機能しません。
以下をよりよく理解するには:
#!/bin/sh
scp /path/to/source/file1 user@host:/path/to/dest
また、次のようになります。
#!/bin/sh
scp /path/to/source/* user@host:/path/to/dest
したがって、これは{ ... }
端末内で実行される複数のファイルを正しく使用することに関連していますが、bashスクリプトを実行している場合はそうではありません。
よろしくお願いします。
//編集する:
cpを使用しようとするとエラーが発生します。
cp: cannot stat '/path/to/source/{file1,file2,file3}': No such file or directory
ベストアンサー1
あなたのスクリプトは代わりに#!/bin/sh
実行されることを意味します。 Ubuntuなどの多くのDebian派生製品では、これはデフォルトのPOSIXシェルへのシンボリックリンクです。使用中の中括弧の拡張は、以下ではサポートされていません。sh
bash
/bin/sh
dash
dash
$ dash
$ echo {foo,bar}
{foo,bar}
これは、コマンドがcp /path/to/source/{file1,file2,file3} /path/to/dest
という名前のエントリを探していることを意味します{file1,file2,file3}
。簡単な解決策はbash
代替を使用することです。 shebang行をからに変更#!/bin/sh
します#!/bin/bash
。