Linux
cp 與父目錄的匹配模式
使用匹配的父目錄模式複制目錄
cp dir/group1/sub01/./././DCM dir/group2/sub01/././DCM to dir/Base/group1/sub01/Time1/ dir/Base/group2/sub01/Time1/ with matched group name and sub name output: dir/Base/group1/sub01/Time1/DCM dir/Base/group2/sub01/Time1/DCM
我在想也許
find * -type d -name "DCM" -execdir bash -c 'old="$1"; new="$(cd ../../..; basename --"$PWD")/$(cd ../..; basename --"$PWD")"; cp -r "$old" "dir/Base/$new"' - {} \;
有什麼建議麼?
我不會寫冗長的複雜行,而是為您提供
awk
:new_dir=$(echo "$dir" | awk -F\/ '{print "dir/Base/"$2"/"$3"/Time1/"}')
並且腳本可能變成:
while read dir do new_dir=$(echo "$dir" | awk -F\/ '{print "dir/Base/"$2"/"$3"/Time1/"}') cp -fdR "$dir" "$new_dir" done <(find . -type d -name DCM)
使用
zsh
:autoload -U zmv zmv -v -C -o -R -- 'dir/(group<->)/(sub<->)/**/DCM' 'dir/Base/$1/$2/Time1/'
上面的
zmv
命令採用擴展的通配模式和目標路徑名。globbing 模式可能包含“擷取組”(帶括號的表達式),您可以在目標路徑名中使用 、 等來引用$1
它們$2
。上面的命令擷取group
和sub
子目錄的名稱(<->
匹配任何數字)。此處使用的選項用於
-n
“試執行”(實際上不執行任何複製;當確定它有效時將其刪除),-v
用於“詳細”操作,以及-C
進行複製而不是移動。我們使用-o -R
傳遞-R
給cp
.測試:
$ tree . `-- dir |-- Base | |-- group1 | | `-- sub01 | | `-- Time1 | `-- group2 | `-- sub01 | `-- Time1 |-- group1 | `-- sub01 | `-- a | `-- b | `-- c | `-- DCM `-- group2 `-- sub01 `-- a `-- b `-- DCM
$ zmv -v -C -o -R -- 'dir/(group<->)/(sub<->)/**/DCM' 'dir/Base/$1/$2/Time1/' cp -R -- dir/group1/sub01/a/b/c/DCM dir/Base/group1/sub01/Time1/ cp -R -- dir/group2/sub01/a/b/DCM dir/Base/group2/sub01/Time1/
$ tree . `-- dir |-- Base | |-- group1 | | `-- sub01 | | `-- Time1 | | `-- DCM | `-- group2 | `-- sub01 | `-- Time1 | `-- DCM |-- group1 | `-- sub01 | `-- a | `-- b | `-- c | `-- DCM `-- group2 `-- sub01 `-- a `-- b `-- DCM