复制具有匹配模式的父目录的目录
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"' - {} \;
有什么建议么?
答案1
我不会写长而复杂的行,而是建议您这样做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)
答案2
使用zsh
:
autoload -U zmv
zmv -v -C -o -R -- 'dir/(group<->)/(sub<->)/**/DCM' 'dir/Base/$1/$2/Time1/'
上面的命令zmv
采用扩展的通配模式和目标路径名。通配模式可能包含“捕获组”(括号内的表达式),您可以在目标路径名中使用 、 等$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
答案3
像这样的事情可能会起作用:
#!/bin/bash
set -e -o pipefail
find . -type d -name DCM | while read dir; do
new_dir_suffix=`echo "$dir" | sed 's/^.*group/group/' | sed 's|\(sub[0-9]*\).*DCM|\1/Time1|'`
cp -fdR "$dir" dir/base/"$new_dir_suffix"
done
在命令中设置变量bash -c
将不起作用,因为这些变量仅存在于这些 Bash 调用的上下文中。无法从find
.