scp 所有以“-123.jpg”结尾的文件 - 递归,空格,通配符…

scp 所有以“-123.jpg”结尾的文件 - 递归,空格,通配符…

事情太多了,我这个菜鸟根本没法理解。我想从远程服务器上的大量嵌套目录中下载所有以 -123.jpg 结尾的文件。其中一些目录的名称中有空格。我认为命令应该是这样的:

scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./

…其中“parent\ directory”是带空格的目录名,指定的路径在分成各个子目录之前尽可能深入,例如 dir/sub dir/[uniquely_id]-123.jpg 文件。(请注意,这些子目录通常也包含空格,这会影响 * 通配符)

如果我干预空格转义,我会得到“无匹配”的返回结果,或者“无此文件或目录”。因此,我认为是我搞错了递归或通配符。

提前致谢。

答案1

使用 scp 进行文件名转义比较棘手;您的参数会在远程端被(重新)扩展。“有趣”的字符必须用双引号引起来,以避免本地 shell 和远程 shell 进行特殊处理。我希望以下两种方法都能为您工作:

scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./

如果这令人困惑,rsync 非常容易使用(正如 lothar 提到的),并且通过 ssh 管道传输 tar 或 cpio 也非常容易。

ssh user@server 'cd /path/to/parent\ directory;
                 find -name "*123.jpg" -print0 | cpio -0 -o' |
    cpio -i -d -v

答案2

由于缺少用于测试的服务器布局,我不知道以下命令是否真的有效,但我认为在这种情况下 rsync 会比 scp 更好,因为您可以指定输入和排除模式。类似于:

rsync -arvzSH  --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/

可能会有用。但你最好再检查一下rsync 文档

答案3

使用通配符的 scp 解决方法:

for i in "*-123.jpg"
do 
    scp $i <user>@<server>:/path/to/destination/
done

参考:https://community.hpe.com/t5/System-Administration/How-to-scp-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/true#M238959

答案4

正确地说,这应该分为两个部分进行:

  1. 首先找到所有需要的文件并将它们复制到一个文件夹(如果你有相同的文件名,则此方法无效) - 你可以用一个find-exec
  2. 然后使用scp

scp复制文件夹结构还不够先进,并且没有单独的命令可以复制文件夹树。

此外,如果您需要文件夹中的所有文件,因为您将无法通过通配符选择它们,并且您想要保留文件夹结构 - 您可能需要使用mc= Midnight Commander 及其“Shell 链接”。

相关内容