与文件中的查找同步

问题描述 投票:0回答:4

我正在尝试传输 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
unix rsync
4个回答
3
投票

不幸的是,当有关此问题的其他问题有更好的答案时,这个问题首先出现在搜索结果中。

--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/
,但这不会保留它们在树中的层次结构,如果您有多个文件,则会创建大量命令行,并且可能无法执行如果超过操作系统的限制。


1
投票

/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.

所以:

  1. 您必须使用 Bash,即如果以交互方式运行,则将其用作命令行 shell;如果在 shell 脚本中运行,则必须将其用作 shell 脚本解释器。
  2. 如果不在命令行上或 shell 脚本中使用 Bash,或者将该命令传递给直接执行 rsync 程序而不是通过 Bash shell 的程序,则它将不起作用。
  3. 您不能将该语法放在双引号内,如图所示。当这样引用时,Bash 将其解释为文件名(因此出现错误)。

-2
投票

试过了,这对我很有用

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

删除空运行以进行实际执行


-2
投票

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

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

/bin/rsync --recursive --remove-source-files `find /tmp/rsync/source -type f -mtime -31` /tmp/rsync/destination
© www.soinside.com 2019 - 2024. All rights reserved.