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/
一样在命令行中列出文件,但这不会在树中保留它们的层次结构,如果您有多个文件,则会创建一个庞大的命令行, 超过操作系统限制可能会执行失败
我正在尝试传输 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/
一样在命令行中列出文件,但这不会在树中保留它们的层次结构,如果您有多个文件,则会创建一个庞大的命令行, 超过操作系统限制可能会执行失败