cp はパターンを親ディレクトリと一致させます。

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"' - {} \;

どんな提案がありますか?

答え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サブディレクトリの名前(すべての数字が一致する場所)をキャプチャします。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

答え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

関連情報