bash - 从 ls 到 rsync 的管道输出
bash - Pipe output from ls to rsync
我正在尝试使用 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
,这里我用 \
转义 space)的文件夹包含 spaces 我认为这可能会导致问题并发现 xargs
可能会有帮助,但仍然没有移动任何东西。
我已经用 sudo
、rsync
和 -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
替换 ls
和 grep
并直接连接到 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
才能递归同步。
非常感谢你们,非常感谢。
使用有问题的ls
和grep
,你想要的可能是:
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/
我正在尝试使用 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
,这里我用 \
转义 space)的文件夹包含 spaces 我认为这可能会导致问题并发现 xargs
可能会有帮助,但仍然没有移动任何东西。
我已经用 sudo
、rsync
和 -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
替换 ls
和 grep
并直接连接到 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
才能递归同步。
非常感谢你们,非常感谢。
使用有问题的ls
和grep
,你想要的可能是:
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/