ディレクトリ構造をコピーし、ターゲットのサブディレクトリの名前を変更する方法

ディレクトリ構造をコピーし、ターゲットのサブディレクトリの名前を変更する方法

このディレクトリ構造を考慮すると

$ lsd --tree                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
.
└── / defs
    ├── / bar
    │   └── / v1
    │       └── bar.txt
    └── / foo
        └── / v1
            └── foo.txt

この構造を生成するには、単純なコマンド/スクリプトが必要です。実際の構造にはより多くのディレクトリがあります。

$ lsd --tree                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
.
└── / defs
    ├── / bar
    │   ├── / v1
    │   │   └── bar.txt
    │   └── / v2
    │       └── bar.txt
    └── / foo
        ├── / v1
        │   └── foo.txt
        └── / v2
            └── foo.txt

ターゲットをコピーして名前を変更します。

答え1

これが解決策かもしれません。

#!/bin/bash
# This is file 'script'.

set -e   # (optional)
         #  immediately exit on some errors, like
         #  mkdir <existing directory>  

ROOT=.  # or some other directory

 # find <directories where to start>  <predicates>
 #    -type d   ... directories
 #    -name 'v1' .... exactly matching v1 
 #    -name '*v1' .... end with v1 
find "$ROOT" -type d -name 'v1'  | while read x;
     do 
       b="${x%v1}"    # remove v1 at the and
       y="${b}v2"     # add v2
       mkdir "$y"
       cp -vr "$x"/. "$y"/
     done

スクリプトをテストするためにいくつかのファイルとディレクトリを作成しましょう。 (最初に完全に削除してくださいx。)

$ rm -fr x; \
 mkdir x x/a x/a/v1 x/a/v1/d x/b x/b/v1; touch x/notcopied x/a/notcopied x/a/v1/f1 x/b/v1/f2 x/a/v1/d/f3; find x; echo -------------;\
 (cd x; bash  ../script);\
 find x;
x
x/a
x/a/notcopied
x/a/v1
x/a/v1/d
x/a/v1/d/f3
x/a/v1/f1
x/notcopied
x/b
x/b/v1
x/b/v1/f2
-------------
'./a/v1/./d' -> './a/v2/./d'
'./a/v1/./d/f3' -> './a/v2/./d/f3'
'./a/v1/./f1' -> './a/v2/./f1'
'./b/v1/./f2' -> './b/v2/./f2'
x
x/a
x/a/v2
x/a/v2/d
x/a/v2/d/f3
x/a/v2/f1
x/a/notcopied
x/a/v1
x/a/v1/d
x/a/v1/d/f3
x/a/v1/f1
x/notcopied
x/b
x/b/v2
x/b/v2/f2
x/b/v1
x/b/v1/f2

/.オンラインにアクセスすることはcp非常に重要です。それがなければ、v2/v1内部にファイルがあります。

関連情報