gpt4 book ai didi

bash - 从 ls 到 rsync 的管道输出

转载 作者:行者123 更新时间:2023-11-29 09:39:05 26 4
gpt4 key购买 nike

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

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

我在 OSX 10.13.3 上。 GNU bash,版本 3.2.57(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/ 

关于bash - 从 ls 到 rsync 的管道输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49690234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com