![rsync 仅文件名](https://linux22.com/image/1338357/rsync%20%E4%BB%85%E6%96%87%E4%BB%B6%E5%90%8D.png)
是否有可能仅有的rsync 文件名?我有一个存储盒,想将文件名(及其路径)添加到另一个存储盒中。我目前正在使用 创建每个文件touch
(它们将以 0 字节大小创建)。这花费的时间太长了,我想知道是否可以用 实现自动化rsync
。
如果没有,还有其他工具可以实现这个功能吗?还是我需要编写一些自定义代码?
答案1
如果您的目的是创建空文件,那么可以像这样创建模板:
#!/bin/bash
FILES=$1 # original structure
TMPL=$2 # where to create empty files
[[ -d $FILES ]] || exit 1
[[ -d $TMPL ]] || mkdir -p $TMPL || exit 1
cd $TMPL
find "$FILES" -type d -printf "$TMPL%p\0" | sort -z |xargs -0 -L 1000 mkdir -p
find "$FILES" -type f -printf "$TMPL%p\0" | xargs -0 -L 1000 touch
这将根据原始树创建每个文件的目录,并触及 TMPL 下创建的文件夹中的文件。
创建仅包含空文件的“镜像”文件夹后,它可以像任何其他文件夹一样 rsynced 到任何主机:
rsync -av -e 'ssh -p 22 -l username' \
/template/structure remotehost:/backup/templates/
如果两个主机上的用户名相同,并且 sshd 在默认端口上运行,则 -e 选项是可选的。请注意在 from 和 to 部分中指定尾部斜杠时会发生什么。这很重要。remotehost 参数可能是 IP 地址而不是别名。
答案2
rsync
本身似乎没有仅创建文件的选项。但是,您可以尝试各种方法,而不是手动使用 touch:
- rsync 目录树,然后
find
在该树的根目录下运行并echo "" >
进入每个文件 - 用来
find
获取目录树的列表,然后mkdir -p
在该列表的每个元素上使用(可能事先进行反向排序以尽量减少系统调用的数量),然后touch
在类似创建的文件列表上使用。
但是,如果有可用空间,我会选择第一个选项,因为它保留了权限和访问权限(给出了适当的参数rsync
)。