事情太多了,我这个菜鸟根本没法理解。我想从远程服务器上的大量嵌套目录中下载所有以 -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
答案4
正确地说,这应该分为两个部分进行:
- 首先找到所有需要的文件并将它们复制到一个文件夹(如果你有相同的文件名,则此方法无效) - 你可以用一个
find
和-exec
- 然后使用
scp
scp
复制文件夹结构还不够先进,并且没有单独的命令可以复制文件夹树。
此外,如果您需要文件夹中的所有文件,因为您将无法通过通配符选择它们,并且您想要保留文件夹结构 - 您可能需要使用mc
= Midnight Commander 及其“Shell 链接”。