bash - 从ls到rsync的管道输出

时间:2018-04-06 10:02:03

标签: bash terminal pipe 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,这里我用\转义空间)文件夹中包含我认为可能会导致问题的空格,发现xargs可能有帮助,但仍然没有&# 39;移动任何东西。

我已使用sudo-avursync的{​​{1}}选项尝试了上述内容,即使这已包含在-r选项中。我通常使用-a的{​​{1}}选项,但我也试过没有。我究竟做错了什么? 是否可以像这样将输入传递给--dry-run

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

谢谢。

3 个答案:

答案 0 :(得分:3)

我建议首先创建要包含/排除的文件列表,然后执行以下操作:

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

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

要创建列表,您可以使用以下内容:

grep -r March /path > list.txt

答案 1 :(得分:1)

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

我最终得到了以下内容:

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

此处-print0-0'空终止' Gert van den Berg描述的数据(我必须因为空格)。 -r中包含-a似乎是多余的,但在使用--files-from时,必须指定rsync以递归方式同步。

非常感谢你们,真的很感激。

答案 2 :(得分:1)

使用有问题的lsgrep,您可能会想要:

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

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

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

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

您也可以管道查找输出:

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

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

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

像这样(未经测试)。见here

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