我尝试使用rsync
来备份包含特定字词的文件夹,使用ls
,grep
和rsync
。但是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
,-avu
和rsync
的{{1}}选项尝试了上述内容,即使这已包含在-r
选项中。我通常使用-a
的{{1}}选项,但我也试过没有。我究竟做错了什么?
是否可以像这样将输入传递给--dry-run
?
我在OSX 10.13.3上。 GNU bash,版本3.2.57(1)
谢谢。
答案 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
替换ls
和grep
并直接汇总到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)
使用有问题的ls
和grep
,您可能会想要:
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/