Bashスクリプトから複数のファイルをコピーする方法

Bashスクリプトから複数のファイルをコピーする方法

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シェルへのシンボリックリンクです。使用中の中括弧の拡張は、以下ではサポートされていません。shbash/bin/shdashdash

$ 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

おすすめ記事