rsync 与在文件中查找

rsync with find in the files-from

我正在尝试传输 31 天内更新过的文件。我正在尝试 运行

/bin/rsync --remove-source-files --files-from="<(find /tmp/rsync/source -type f -mtime -31 -print0)" /tmp/rsync/source /tmp/rsync/destination

然而,在尝试此操作时,我不断收到以下错误:

failed to open files-from file <(find /tmp/rsync/source -type f -mtime -31 -print0): No such file or directory

该目录存在并且可以访问。

这是查找的输出:

$ find /tmp/rsync/source -type f -mtime -31  
/tmp/rsync/source/testfile2.txt  
/tmp/rsync/source/testfile.txt  
/tmp/rsync/source/sourcefile.txt

试过了,这对我来说很好用

find /tmp/rsync/source -type f -mtime -31 | rsync -rcvh /tmp/rsync/source/ /tmp/rsync/destination/ --dry-run

去掉dry-运行实际执行

由于我被迫使用一个预先存在的脚本,该脚本在“{”括号上进行解析,并且您无法在 rsync 脚本之前执行 运行 命令,因此我无法使用上述解决方案。

但是我能够使用以下方法让它工作:

/bin/rsync --recursive --remove-source-files `find /tmp/rsync/source -type f -mtime -31` /tmp/rsync/destination

不幸的是,当 other questions about this 有更好的答案时,它在搜索结果中排在第一位。

我看到人们在好几个地方使用 --files-from="<(...)" 符号,但我在 rsync 手册中没有看到任何关于它的参考。也许对某些人来说这是一种特殊的 shell 语法?或发行版添加的功能?当我尝试使用该表示法时,我收到与上述相同的错误消息。

官方方法是将文件列表写入真实文件:

find . -mtime -7 > past_week.txt
rsync --from-files=past_week.txt SRC/ DST/

或通过管道传输标准输入中的文件列表:

find . -mtime -7 | rsync --from-files=- SRC/ DST/

此处的单破折号 - 文件名表示 STDIN,这是 unix 工具中的通用约定。

如果您担心文件名中包含换行符的文件,您应该在列表中使用 NUL 分隔符。 (但请注意,这也会影响 --include-from--exclude-from

find . -mtime -7 -print0 | rsync -0 --from-files=- SRC/ DST/

您也可以像 rsync -av `find . -mtime -7` DST/ 一样在命令行中列出文件,但这不会在树中保留它们的层次结构,如果您有多个文件,则会创建一个庞大的命令行, 超过操作系统限制可能会执行失败