scpを使用してすべてのファイル名を変更する

scpを使用してすべてのファイル名を変更する

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ローカル-starは非常に制限されていますが、サーバーにGNU tarまたはBSD tarがある場合は、サーバー側で名前を変更できます。

ネットワーク帯域幅によってボトルネックが発生した場合は、圧縮ステップを挿入する必要があります。アーカイブ方法を使用すると、パイプラインにステップを挿入できます。

tar -czf - --transform '/\.db$/_1.db/ *.db | ssh user@host 'cd /dir && gunzip | tar -xf -'

-Csshまたは、オプションをまたはに渡してsshfsSSHレベルで圧縮できますscp

関連情報