scp を使用して、あるサーバーから別のサーバーにファイルを送信します。ファイルを送信したら、名前を変更する必要があります。そのため、各ファイルに対して次のコマンドを使用します。
scp original-hc.db user@host:/dir/original-hc_1.db
ファイル名を変更するには、単一のコマンドを使用してすべてのファイルを送信したいと思います。良い
scp *.db user@host:/dir/(actual file name before extension)_1.db
答え1
これはループを使用して簡単に達成できます。
for f in *.db
do
scp "$f" user@host:/dir/"${f%.db}"_1.db
done
この${f%.db}
構文は.db
サフィックスを削除します$f
。
答え2
scp
複数のファイルをディレクトリにコピーする場合はファイル名を変更できないため、パターンベースの名前変更を実行するには、追加または代わりに別のツールを使用する必要があります。
SCPアクセスだけでなくSFTPアクセスもある場合は、次のものを使用できます。SSHFSリモートファイルがローカルコンピュータに表示されるようにします。これにより、ファイルのコピーと名前変更ツールを使用できます。
mkdir mnt
sshfs user@host:/dir
pax -rw -pe -s'/\.db$/_1.db/' *.db mnt
fusermount -u mnt
代わりにGNUまたはBSD tar、zshなどを使用できますpax
(POSIXですが、Linuxでは常にパッケージとして使用できますが、デフォルトではインストールされない場合があります)。zcp
またはコピーを実行するループです。
for x in *.db; do
cp -p "$x" "mnt/${x%.db}_1.db"
done
SSHFSがなくてもループ方式を使用できますが、必ずscp
ループ内で使用する必要があります。
for x in *.db; do
scp -p "$x" "user@host:/dir/${x%.db}_1.db"
done
毎回SSH接続を確立するのは少し遅いかもしれません。 OpenSSHを使用すると、接続を一度開いて後で使用できます。バラより設定された SSH チャネルの使用
サーバーへのフルシェルアクセスが必要なもう1つの方法は、ファイルをアーカイブしてアーカイブをコピーして、アーカイブまたは解凍時に名前変更ステップを適用することです。たとえば、ローカルにGNU tarがある場合(これは組み込まれていないLinuxの場合は常に該当し、通常は次のgtar
ような他のUnixバリアントで使用できます)。
tar -cf - --transform '/\.db$/_1.db/ *.db | ssh user@host 'cd /dir && tar -xf -'
BSD tarの場合、--transform
ローカル-s
tarは非常に制限されていますが、サーバーにGNU tarまたはBSD tarがある場合は、サーバー側で名前を変更できます。
ネットワーク帯域幅によってボトルネックが発生した場合は、圧縮ステップを挿入する必要があります。アーカイブ方法を使用すると、パイプラインにステップを挿入できます。
tar -czf - --transform '/\.db$/_1.db/ *.db | ssh user@host 'cd /dir && gunzip | tar -xf -'
-C
ssh
または、オプションをまたはに渡してsshfs
SSHレベルで圧縮できますscp
。