gra*_*olf 1 scp directory slash
我有本地文件结构:
/tmp/24
/dir1
/file1
/file2
/dir2
/file3
/file4
Run Code Online (Sandbox Code Playgroud)
我想将它上传到远程计算。当我使用
rsync /tmp/24 host:/target
Run Code Online (Sandbox Code Playgroud)
它target
在远程主机 ( /target/24/dir1/file1
, ...)上的目录中创建它。但是当我像这样使用它时
rsync /tmp/24/ host:/target
Run Code Online (Sandbox Code Playgroud)
但我想要做什么,那就是这样的创建它们:/target/dir1/file1
。但是,scp
如果目标文件夹已经存在,则做第一件事,第二件事是不考虑路径是否以结尾/
。我怎样才能强制scp
表现得像rsync
第二个例子?
源目录名称的尾随“/”是 rsync 的微妙之处。注意它。
源上的尾部斜杠有效地表示“复制此目录的内容,而不是目录本身”。如果没有尾部斜杠,则表示“复制目录”。
所以rsync -a tmp/24/ host:/target
将“/tmp/24/”的内容复制到“host:/target/...”中。
但是rsync -a tmp/24 host:/target
会将目录“/tmp/24/”(及其内容)复制到“host:/target/24/...”。
如果“host:/target/”不存在也没关系;如有必要,它将被创建并且结果是相同的。
(目的地的尾部斜杠无关紧要。)
???????????????????????????????????????????????????????????????????
? rsync ? target exists ? target does not exist ?
???????????????????????????????????????????????????????????????????
? rsync -a tmp/24 target ? target/24/… ? target/24/… ?
???????????????????????????????????????????????????????????????????
? rsync -a tmp/24/ target ? target/… ? target/… ?
???????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
斜线根本无关紧要,仅在于目标目录是否存在。如果存在,则将源目录复制到目标目录中,否则将创建目标目录作为源目录的克隆。
?????????????????????????????????????????????????????????????????
? scp ? target exists ? target does not exist ?
?????????????????????????????????????????????????????????????????
? scp -r tmp/24 target ? target/24/… ? target/… ?
?????????????????????????????????????????????????????????????????
? scp -r tmp/24/ target ? target/24/… ? target/… ?
?????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
所以你是对的,你应该先做ssh host mkdir -p /target
,然后行为将与 rsync 相同。
但是为什么不直接使用 rsync 呢?它的作用远不止于此,例如部分传输、中断传输和压缩数据。
rsync -azu tmp/24 host:/target
Run Code Online (Sandbox Code Playgroud)
并且为了完整性:在 Mac 上,只要目标已经存在,尾随的“/”就会为您提供 rsync 语义。
????????????????????????????????????????????????????????????????
? cp (Mac) ? target exists ? target does not exist ?
????????????????????????????????????????????????????????????????
? cp -a tmp/24 target ? target/24/… ? target/… ?
????????????????????????????????????????????????????????????????
? cp -a tmp/24/ target ? target/… ? target/… ?
????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
在 Linux 下,斜线根本无关紧要,与 scp 相同:
????????????????????????????????????????????????????????????????
? cp (Linux) ? target exists ? target does not exist ?
????????????????????????????????????????????????????????????????
? cp -a tmp/24 target ? target/24/… ? target/… ?
????????????????????????????????????????????????????????????????
? cp -a tmp/24/ target ? target/24/… ? target/… ?
????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
添加... ditto(1) 是一个用于克隆目录的 Mac OS 工具。它尽可能精确地复制。
斜线根本不重要。目标目录是否已经存在并不重要。
???????????????????????????????????
? ditto tmp/24 target ? target/… ?
???????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
如果目标已存在,则无条件覆盖先前存在的文件。目标中不在源中的文件被单独留下。