不遵循链接或创建巨大的 tar 文件的递归 scp?

Inq*_*Kea 6 scp symlink

所以我在我的远程文件服务器(处于另一种状态)上做了一个递归的 scp,它在我的远程 web 目录上创建了一个无限循环的链接......

http://www.linuxquestions.org/questions/linux-general-1/recursive-scp-wo-following-links-658857/说我可以尝试创建一个巨大的 tar 文件。不过这有一个问题——我在办公室的一台 Linux 机器上运行递归 scp,我正在将文件全部复制到我的外部硬盘驱动器,它是 FAT32 格式(因为我需要一些可以通过UNIX 和 Windows)。FAT32 不支持大文件。所以我必须尝试不同的东西。

还有一个 rsync 选项,但我办公室的 Linux 机器非常原始(它是 igel),所以它没有 rsync ......

小智 5

我不建议scp直接用于传输大型文件树,因为它既不能正确处理硬链接也不能正确处理软链接,而且流也没有被压缩。

我建议cpio使用 (de) 动态压缩:

ssh user@host "cd /path/to/files && find . | cpio -ov | bzip2 -c" | bunzip2 -c | cpio -ivd
Run Code Online (Sandbox Code Playgroud)

此外,find可以处理其他条件,例如“文件必须小于 4G”

find . -size -4G | ...
Run Code Online (Sandbox Code Playgroud)

为了使cpio空间更友好(正确处理文件名中的空格),请使用

find . -print0 | cpio -0 -ivd | ...
Run Code Online (Sandbox Code Playgroud)


小智 5

sftp -r另一种选择是按照手册所述使用sftp

上传和下载时递归复制整个目录。请注意,sftp 不遵循树遍历中遇到的符号链接。

所以

sftp -r source@surce_server.com:/source/dir .
Run Code Online (Sandbox Code Playgroud)

正是你想做的事。


Gil*_*il' 3

您无需在发送之前创建 tar 文件。你可以即时制作:

cd /source/dir
tar -cf - . | ssh 'cd /destination/directory && tar -xf -'
Run Code Online (Sandbox Code Playgroud)

这确实要求远程服务器接受 ssh shell 连接,而不仅仅是 scp 连接。理论上,可以将任意文件树发送到与本地文件结构之类的任何内容都不对应的远程端,但我不知道有任何现有工具可以执行此操作。

如果符号链接是一个问题,您可以制作一个不包含符号链接并且占用的空间可以忽略不计的目录树的副本,假设源树位于支持硬链接的文件系统上(因此任何本机unix文件系统,或NTFS,但不是 FAT)。我在这里假设 GNU 实用程序:

cd /source/dir
mkdir ../regular-files-only
cp -al . ../regular-files-only
find ../regular-file-only \! -type f \! -type d -delete
Run Code Online (Sandbox Code Playgroud)

您还可以使用 sftp。sftp -r不遵循符号链接,与scp -r.