Filesystems
如何複製嵌套在匹配模式的目錄中的文件?
我正在尋找從匹配此模式的子目錄中復製文件
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
已經存在。我還假設您對具有隱藏名稱的子目錄或文件不感興趣。