我使用 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
将多个文件复制到目录时无法重命名文件,因此您需要另外使用其他工具或代替来执行基于模式的重命名。
如果您有 SFTP 访问权限而不仅仅是 SCP 访问权限,那么您可以使用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 通道
另一种方法(需要服务器上的完整 shell 访问权限)是存档文件并复制存档,并在存档或解压时应用重命名步骤。例如,如果您本地有 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,则可以在服务器端进行重命名。
如果网络带宽是瓶颈,您可能需要插入压缩步骤。使用 archive 方法,您可以在管道中插入步骤:
tar -czf - --transform '/\.db$/_1.db/ *.db | ssh user@host 'cd /dir && gunzip | tar -xf -'
-C
或者,您可以通过将选项传递给ssh
、sshfs
或来在 SSH 级别进行压缩scp
。