【问题标题】:bash - Pipe output from ls to rsyncbash - 管道输出从 ls 到 rsync
【发布时间】:2018-04-06 10:02:03
【问题描述】:

我正在尝试使用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 可能有帮助,但仍然没有移动任何东西。

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

我使用的是 OSX 10.13.3。 GNU bash,版本 3.2.57(1)

谢谢。

【问题讨论】:

  • @rkta 谢谢。 “去”的替代方案是什么?
  • 您没有将空终止的数据提供给xargs -0... 如果您想限制xargs 作为参数给出的文件数量,您需要添加-n 选项。 . 如果dst 是您的目的地,您需要将源放在它之前,为此您需要在xargs 上使用-I...(可能与-n1 一起使用)。将echoxargs 一起使用是调试它的最简单方法...

标签: bash terminal pipe rsync


【解决方案1】:

使用有问题的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/ 

【讨论】:

  • 哇。感谢您的广泛回答!清除方法,以及回答原始问题;来自 ls. 的管道
  • 注意:如果使用了-a,则不需要使用-r rsync 选项,因为-a 已经包含-r。但是,如果您使用 --files-from 而不是 --include-from,则应明确指定它 (-ar) 以具有递归行为,因为 --files-from 将其从 -a 中删除。
  • @Giuseppe 查找将返回所有文件名...(没有-type o 将其限制为仅目录/文件)(find 进行递归,rsync 没有需要)
【解决方案2】:

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

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

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

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

grep -r March /path > list.txt

【讨论】:

  • 感谢您的回答!我考虑尝试将ls -d $PWD/** | grep March 的输出写入文件,然后按照您的建议进行操作,这可能最终会成为我这样做的方式。虽然我认为它的“开销”更少,而且如果可以做一些我尝试过的事情,对我来说更直观。顺便说一句,感谢您将-z 选项放在我的雷达上,您几乎总是会使用它吗?还是用于大文件?
  • @Morten -z 更像是一种习惯,但如果您想获得更快的速度并获得一些想法(实际上它们禁用压缩),请检查这个:gist.github.com/KartikTalwar/4393116
  • why not use ls,grep更靠谱
【解决方案3】:

我想通了。使用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 指定它才能递归同步。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-23
    • 2018-04-24
    • 2016-06-18
    • 1970-01-01
    • 2013-09-23
    • 2012-07-12
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多