首页 > 解决方案 > 从 bash 脚本运行 find 和 rsync

问题描述

我正在尝试使用 rsync 命令运行 find 。我按照这里的答案。
当我从命令行运行它时,它运行正常。

find ./copy1 -mtime +14  -printf %P\\0 | rsync -avc --dry-run --files-from=- --from0 ./copy1 /home/shlo/copy1/

当我从 bash 脚本运行它时,问题就开始了:

RSYNC_COM='find ./copy1 -mtime +14  -printf %P\\0 | rsync -avc --dry-run --files-from=- --from0 ./copy1 /home/shlo/copy1/'
output=$($RSYNC_COM 2>&1)

我得到错误:

查找:路径必须在表达式之前:| 用法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

看起来他认为 rsync 命令是 find 命令中的参数。

我该如何解决?

谢谢

标签: bashrsync

解决方案


问题是您将命令分配给变量。|不再被解析为管道“运算符”,而是作为普通字符串。

# echo 123 | cat
123
# a="echo 123 | cat"
# $a
123 | cat

|参数无效find,因此它返回错误。

使用一个函数:

rsync_com() {
         find ./copy1 -mtime +14  -printf %P\\0 |
         rsync -avc --dry-run --files-from=- --from0 ./copy1 /home/shlo/copy1/
}
output=$(rsync_com 2>&1)

请记住始终引用变量扩展。并且永远不要运行由未转义的变量扩展创建的命令。

约定是大写变量保留为导出变量。


推荐阅读