Filesystems

如何複製嵌套在匹配模式的目錄中的文件?

  • March 21, 2021

我正在尋找從匹配此模式的子目錄中復製文件

vendor/plugin/*/tasks/*.rake

放入文件夾

lib/tasks

聽起來很簡單:

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

或者,如果第一個*應該匹配整個子樹,請使用以下內容:

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

假設您想通過通知而不是覆蓋文件來處理名稱衝突(例如,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已經存在。我還假設您對具有隱藏名稱的子目錄或文件不感興趣。

引用自:https://unix.stackexchange.com/questions/7014