正規表現を使用してコピーするソースファイルの名前を取得するには?

正規表現を使用してコピーするソースファイルの名前を取得するには?

名前に次のタイムスタンプを含むファイルをコピーしたいと思います。

image-abc-20201113-1703.bin

場所に/my/path/for/the/image

この画像をデバイスにコピーしたい -mydevice保存場所~/.ssh/config

ファイル名が一定ではないため、スクリプトにハードコードできません。

そのため、正規表現を使用して次のようにファイルをコピーします。

scp /my/path/for/the/image/image-abc-*.bin mydevice:flash:<file_name>

したがって、コピーされるソースファイルの名前に言及する必要があります。file_name

この目標をどのように達成できますか?

答え1

正しい宛先ファイル名を指定する必要があると思う場合は、そうしないでください。必要次に、ファイル名ワイルドカードパターン(これは正規表現ではありません。)ループで:

for pathname in /my/path/for/the/image/image-abc-*.bin
do
    [ -e "$pathname" ] &&
    scp "$pathname" "mydevice:flash:$(basename "$pathname")"
done

指定されたワイルドカードパターンに一致するすべてのファイルをコピーします。この-eテストは、$pathname呼び出し前のパス名が実際に存在することを確認しますscp(一致する名前がない場合、パターンは拡張されていません)。

このbasenameユーティリティは、ここでパス名のファイル名部分を抽出するために使用されます。これはターゲットファイル名として使用されます。"${pathname##*/}"コマンド置換呼び出しの代わりにパラメータ置換を使用することもできますbasename

パターンが単一のファイルにのみ一致すると確信している場合でも、次のことができます。

set -- /my/path/for/the/image/image-abc-*.bin
[ -e "$1" ] && scp "$1" "mydevice:flash:$(basename "$1")"

これは、パターンと一致するパス名の拡張リストを保持するために位置引数を使用して上記のループの最初の反復を実行するのと基本的に同じです。

関連情報