使用 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将多个文件复制到目录时无法重命名文件,因此您需要另外使用其他工具或代替来执行基于模式的重命名。

如果您有 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或者,您可以通过将选项传递给sshsshfs或来在 SSH 级别进行压缩scp

相关内容