我正在尝试传输 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
不幸的是,当有关此问题的其他问题有更好的答案时,这个问题首先出现在搜索结果中。
--files-from="<(...)"
符号不正确;引号导致该文字字符串传递给 rsync。 符号 <(...)
是 bash 语法,它执行括号中的命令,并将该符号替换为外部程序可以读取的管道路径。 因此,如果您使用的是 bash,只需删除引号即可。
如果您不使用 bash,官方方法是将文件列表写入真实文件中:
find . -mtime -7 > past_week.txt
rsync --files-from=past_week.txt SRC/ DST/
或者通过管道传输标准输入上的文件列表:
find . -mtime -7 | rsync --files-from=- SRC/ DST/
这里的单破折号
-
文件名表示STDIN,这是unix工具中的常见约定。
如果您担心文件名中包含换行符,则应在列表中使用 NUL 分隔符。 (但要注意这也会影响
--include-from
和--exclude-from
)
find . -mtime -7 -print0 | rsync -0 --files-from=- SRC/ DST/
您还可以在命令行上列出文件,例如
rsync -av `find . -mtime -7` DST/
,但这不会保留它们在树中的层次结构,如果您有多个文件,则会创建大量命令行,并且可能无法执行如果超过操作系统的限制。
/bin/rsync --remove-source-files --files-from="<(find /tmp/rsync/source -type f -mtime -31 -print0)" /tmp/rsync/source /tmp/rsync/destination
<( ... )
是 Bash Shell 进程替换 - https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html.
所以:
试过了,这对我很有用
find /tmp/rsync/source -type f -mtime -31 | rsync -rcvh /tmp/rsync/source/ /tmp/rsync/destination/ --dry-run
删除空运行以进行实际执行
由于我被迫使用一个预先存在的脚本,该脚本在“{”括号上进行解析,并且在 rsync 脚本之前无法运行命令,因此我无法使用上述解决方案。
但是我能够使用以下方法让它工作:
/bin/rsync --recursive --remove-source-files `find /tmp/rsync/source -type f -mtime -31` /tmp/rsync/destination