获取 `scp path/` 行为类似于 `rsync path/`

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第二个例子?

Edw*_*alk 7

源目录名称的尾随“/”是 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

斜线根本无关紧要,仅在于目标目录是否存在。如果存在,则将源目录复制目标目录中,否则将创建目标目录作为源目录的克隆。

?????????????????????????????????????????????????????????????????
? 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)

cp

并且为了完整性:在 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)

如果目标已存在,则无条件覆盖先前存在的文件。目标中不在源中的文件被单独留下。