Linux

cp 與父目錄的匹配模式

  • March 2, 2022

使用匹配的父目錄模式複制目錄

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。上面的命令擷取groupsub子目錄的名稱(<->匹配任何數字)。

此處使用的選項用於-n“試執行”(實際上不執行任何複製;當確定它有效時將其刪除),-v用於“詳細”操作,以及-C進行複製而不是移動。我們使用-o -R傳遞-Rcp.

測試:

$ 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

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