名前に次のタイムスタンプを含むファイルをコピーしたいと思います。
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")"
これは、パターンと一致するパス名の拡張リストを保持するために位置引数を使用して上記のループの最初の反復を実行するのと基本的に同じです。