如何复制嵌套在与模式匹配的目录中的文件?

如何复制嵌套在与模式匹配的目录中的文件?

我正在寻找从与此模式匹配的子目录复制文件

vendor/plugin/*/tasks/*.rake

放入文件夹中

lib/tasks

答案1

听起来很简单:

cp vendor/plugin/*/tasks/*.rake lib/tasks

或者,如果第一个*应该匹配整个子树,请使用类似以下内容的内容:

find vendor/plugin -path "*/tasks/*.rake" -exec cp "{}" lib/tasks +

答案2

假设您希望通过收到有关名称冲突的通知而不是覆盖文件来处理名称冲突(例如,vendor/plugin/a/tasks/1.rake和 之间发生的冲突),则使用 shell 循环:vendor/plugin/b/tasks/1.rake

destdir=lib/tasks

for pathname in vendor/plugin/*/tasks/*.rake
do
    destpath=$destdir/${pathname##*/}

    if [ -e "$destpath" ]; then
        printf 'Can not move "%s", "%s" is in the way' \
            "$pathname" "$destpath" >&2
        continue
    fi

    cp "$pathname" "$destpath"
done

线路

destpath=$destdir/${pathname##*/}

也可以写成

destpath=$destdir/$(basename "$pathname")

并简单地构造目的地的路径名,以检查它是否已被占用。

你也可以这样做

cp -i vendor/plugin/*/tasks/*.rake lib/tasks

从实用程序本身获取每个名称冲突的交互式提示cp。该命令依赖于vendor/plugin/*/tasks/*.rake在命令行上扩展模式,并且根据扩展的路径名数量,它可能会触发“参数列表太长”错误,在这种情况下可以使用循环来代替:

for pathname in vendor/plugin/*/tasks/*.rake
do
    cp -i "$pathname" lib/tasks
done

这个循环与这个答案中的初始循环几乎相同。唯一的区别是,我们让cp实用程序在出现名称冲突时提示用户。

上面的所有变体都假设模式vendor/plugin/*/tasks/*.rake实际上匹配某些内容并且目标目录lib/tasks已经存在。我还假设您对具有隐藏名称的子目录或文件不感兴趣。

相关内容