我正在寻找从与此模式匹配的子目录复制文件
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
已经存在。我还假设您对具有隐藏名称的子目录或文件不感兴趣。