ディレクトリ構造を持つ特定のサブフォルダを新しいフォルダにコピーする


8

次のディレクトリ構造があります。

                Main_Dir
                   |
  -----------------------------------
  Subdir1       Subdir2       Subdir3
     |             |             |
 ---------     ---------     ---------
 |   |   |     |   |   |     |   |   |            
fo1 fo2 f03   fo1 fo2 f03   fo1 fo2 f03

私はすべてのサブディレクトリを(コピーしたいSubdir1Subdir2Subdir3新しいフォルダに)。しかし、私は新しい場所にフォルダをコピーfo1したいだけですfo2

それがどうやってできるのか分かりません。


すべてをコピーし、fo3を削除しますか?
ChuckCottrill 2013年

回答:


4

ディレクトリのツリーが単なるものではない場合、..../f03このrsyncコマンドを使用して、すべてのfo1&をコピーfo2し、という名前のその他すべてのディレクトリを除外できますfo*

$ rsync -avz --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

これらの種類のコピーシナリオを処理するときはrsync、常に--dry-run--verboseスイッチを使用するので、実際にファイルをコピーしなくても、何が行われるかを確認できます。

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

ドライラン。

$ rsync -avz --dry-run --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.
sending incremental file list
./

Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

rsync何が含まれている/含まれていないのかについてのの内部ロジックを確認したい場合は、--verboseスイッチを使用してください。

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

sending incremental file list
[sender] showing directory Subdir1/fo2 because of pattern fo[12]/
[sender] showing directory Subdir1/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir1/fo3 because of pattern fo*/
[sender] showing directory Subdir2/fo2 because of pattern fo[12]/
[sender] showing directory Subdir2/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir2/fo3 because of pattern fo*/
[sender] showing directory Subdir3/fo2 because of pattern fo[12]/
[sender] showing directory Subdir3/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir3/fo3 because of pattern fo*/
delta-transmission disabled for local transfer or --whole-file
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

他の形式のディレクトリを除外する必要がある場合は、複数の除外を追加できます。



0

あなたはこのようなことを試すことができます:

find Main_Dir -maxdepth 1 -mindepth 1 -type d | while IFS= read -r subdir; do
   mkdir -p new_dir/"$(basename $subdir)" && 
   cp -r "$subdir"/{fo1,fo2} new_dir/"$(basename $subdir)"/; 
done

このfindコマンドは、Main_Dirのすべての直接サブディレクトリを返します。basename見つかったサブディレクトリの名前をbasename Main_Dir/Subdir1返します(例:を返しますSubdir1)。次に、シェルのブレース展開を使用して、入力fo1fo2何度も避け、新しく作成したnew_dir/$(basename $subdir)ディレクトリにコピーします。

下にディレクトリしかMain_Dirない、名前にスペースや奇妙な文字がないという特定のケースでは、上記を単純化して次のようにすることができます。

cd Main_Dir; for subdir in *; do 
  mkdir -p ../new_dir/$subdir && cp -rv $subdir/{fo1,fo2} ../new_dir/$subdir; 
done

0

ディレクトリ構造が例とまったく同じである場合(つまり、すべてのfoファイルが同じレベルにある場合):

mkdir -p New_Dir/{Subdir1,Subdir2,Subdir3}
for subdir in Subdir1 Subdir2 Subdir3;do
    cp -r Main_Dir/"$dir"/{fo1,fo2} New_Dir/"$dir"/
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.