如何使scp复制隐藏文件?


63

我经常使用SCP来复制文件-特别是与Web相关的文件。问题是,每当执行此操作时,我都无法获取复制隐藏文件的命令(例如,.htaccess)。

我通常会这样调用:

scp -rp src/ user@server:dest/

这不会复制隐藏文件。我不希望有再次调用这个(做类似的东西scp -rp src/.* ...-并且具有奇怪...意义呢。

我在scp手册页中没有看到有关“包括隐藏文件”的任何内容。

我该怎么做?


我认为src/.*也要复制src/..(父目录),对吗?
肯·夏普

Answers:


67

那应该绝对匹配隐藏文件。源代码末尾的/表示“此目录下的每个文件”。但是,测试和研究可以帮助您。这是愚蠢的行为。

答案 ”是在源的末尾添加一个点:

scp -rp src/. user@server:dest/

真正的答案是使用rsync。


好招,我还没有意识到这一点。
cstamas

21
rsync -avz -e ssh --progress src / user @ server:dest /
MikeyB,2009年

2
我无法重现该行为。 scp -r source/ host:source2复制点文件。从2007
。– Mikel

3
请注意,.由于安全问题,在末尾添加a 不再有效(2019)。这是在这里解释: superuser.com/questions/1403473/scp-error-unexpected-filename
斯特凡

25

您可以尝试rsync。它更适合此工作:

rsync -av src / user @ server:dest /

(其手册页值得一读。)


2
一直对rsync使用--progress选项,没有它我就活不下去= D
Hofa

1
@Hofa我通常使用-P,因为它更短,它已经包括--progress并且还包括--partial,如果我已经对它的进度感兴趣,那么它就可以理解;-)
cstamas 2012年

9

不要在源目录后加斜杠。您的代码如下所示:

scp -rp src user@server:dest/

这将在远程计算机上的“目标”下创建目录“ src”,其中包含所有隐藏文件。它可能不是您想要的,但是它将在src中复制隐藏的文件。


3

以下将解决问题,此问题已在我们的持续集成环境中进行了全面测试

scp -rp src/. user@server:dest/
example scp -rp /usr/src/code/. content001@172.11.11.11:/usr/dest/code/

希望能帮助到你


最近更新了scp之后,结果为scp: error: unexpected filename: . 。一定要测试一下它是否适合您的发行版,其他Googler :)
Moritz Friedrich

1

要仅复制隐藏文件,请使用此命令

scp -rp /path_to_copy_hidden/.[!.]* user@host:/path_to_paste/

实际游戏是/.[!.]*指以.(隐藏)开头的文件的标签


0

上面的scp解决方案都不适合我。但是,我确实发现以下内容适用于cygwin:scp -r directory / * host:directory'*'匹配所有可见文件,并跳过不可见文件。


0

如果在远程计算机上禁用了密码登录,并且唯一的登录方式是通过公共密钥,则可以使用以下方法:

$ rsync -av -s 'ssh -i /path/to/your/private/SSH/key' --progress user1@remote.host:/remote/source/directory/ /local/destination/directory/

它也复制隐藏文件。

还请注意,“ user1”必须具有读取这些文件的权限,例如,您不能使用此方法复制其他用户的ssh文件夹。


0

由于scp支持正则表达式,因此可以很好地为您解决问题:

scp -rp src/(*|.*) user@server:dest/


0

分布式修订控制处理隐藏文件

由于CVE-2018-20685漏洞,该/.技巧不再可以一起使用scp。但是,像git或Hg Mecurial 这样的分布式修订控制将像其他文件一样处理隐藏文件。这是我最喜欢的汞汞的命令:

server:$ sudo apt install mercurial
client:$ sudo apt install mercurial
client:$ hg init src
client:$ cd src/
client:$ hg addr
client:$ hg com -m "first commit"
client:$ cd
client:$ hg clone src ssh://user@server/dest/

随后的更改将需要使用再次提交client:$ hg com -m "commit message",然后使用client:$ hg push命令进行推送。从此汞汞备忘单中了解更多有关推动变革的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.