私は次のディレクトリ構造を持っています:
Main_Dir
|
-----------------------------------
Subdir1 Subdir2 Subdir3
| | |
--------- --------- ---------
| | | | | | | | |
fo1 fo2 f03 fo1 fo2 f03 fo1 fo2 f03
すべてのサブディレクトリ(Subdir1
、Subdir2
、Subdir3
)を新しいフォルダにコピーしたい。ただし、fo1
およびfo2
フォルダーを新しい場所にコピーするだけです。
それがどうやってできるのか分かりません。
ディレクトリのツリーが単なる..../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)
他の形式のディレクトリを除外する必要がある場合は、複数の除外を追加できます。
rsync
を使用:
rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
ディレクトリ構造が例とまったく同じである場合(つまり、すべての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
あなたはこのようなものを試すことができます:
_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
_を返します)。次に、シェルの ブレース展開 を使用して、_fo1
_および_fo2
_を複数回入力することを避け、新しく作成した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
_