bash - 从 ls 到 rsync 的管道输出

bash - Pipe output from ls to rsync

我正在尝试使用 rsync 备份包含特定单词的文件夹,使用 lsgreprsync。但是 rsync 似乎不接受 grep 的输出作为输入。我尝试了以下方法:

$ ls -d $PWD/** | grep March | rsync -av 'dst'

这实际上没有任何作用,即使仅使用 ls -d $PWD/** | grep March 会准确生成我要移动的文件夹列表。

$ ls -d $PWD/** | grep March | xargs -0 | rsync -av 'dst'
$ ls -d $PWD/** | grep March | xargs -0 echo | rsync -av 'dst'
$ ls -d $PWD/** | grep March | xargs -0 rsync -av 'dst'

许多(包括 dst,这里我用 \ 转义 space)的文件夹包含 spaces 我认为这可能会导致问题并发现 xargs 可能会有帮助,但仍然没有移动任何东西。

我已经用 sudorsync-r-avu 选项尝试了上述方法,尽管我将其包含在 -a 选项中。我通常对 rsync 使用 --dry-run 选项,但我也尝试过不使用。我究竟做错了什么? 是否可以像这样将输入通过管道传递给 rsync

我在 OSX 10.13.3。 GNU bash,版本 3.2.57(1)

谢谢。

我建议先创建文件列表到 include/exclude,然后执行类似的操作:

rsync -avz --include-from=list.txt source/ destination/

rsync -avz --exclude-from=list.txt source/ destination/

要创建您的列表,您可以使用类似的东西:

grep -r March /path > list.txt

我明白了。使用 find 替换 lsgrep 并直接连接到 rsync

我得到以下结果:

$ find . -type d -maxdepth 1 -name '*March*' -print0 | rsync -av0r --files-from=- ./ /dst/

此处 -print0-0 'null-terminates' Gert van den Berg 描述的数据(由于空格,我必须这样做)。 -r 似乎是多余的,因为它包含在 -a 中,但是当使用 --files-from 时,必须指定 rsync 才能递归同步。

非常感谢你们,非常感谢。

使用有问题的lsgrep,你想要的可能是:

ls -d "$PWD"/** | grep March | xargs -r -n1 -I'{}' rsync -av '{}' 'dst'

更好的方法是使用--include-from

一个选项是让bash模拟命名管道:

rsync -av0 --include-from=<(find . -path '*March*' -print0) "$PWD"/ /dst/

您也可以通过管道传递查找输出:

find . -path '*March*' -print0| rsync -av0 --include-from=- "$PWD"/ /dst/

-path 用于在文件名中的任何位置查找“March”。 (类似于 grep

(rsync 可能也有一些参数来进行过滤,比如 --include--exclude 模式)

类似这样的东西(未经测试)。参见 here

rsync -av --include="*/" --include="*March*" --exclude="*" "$PWD"/ /dst/