디렉터리 구조의 특정 하위 폴더를 새 폴더에 복사

디렉터리 구조의 특정 하위 폴더를 새 폴더에 복사

다음과 같은 디렉토리 구조가 있습니다.

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

Subdir1모든 하위 디렉터리( , Subdir2, Subdir3)를 새 폴더에 복사하고 싶습니다 . 하지만 새 위치 fo1에 복사하고 싶습니다 .fo2

어떻게 해야할지 모르겠습니다.

답변1

디렉토리 트리가 단순한 디렉토리 트리 이상의 경우 ..../f03이 명령을 사용하여 각 &를 rsync복사 하고 이름이 지정된 다른 모든 디렉토리를 제외할 수 있습니다 .fo1fo2fo*

$ 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)

다른 형태의 디렉터리를 제외해야 하는 경우 여러 제외를 추가할 수 있습니다.

답변2

사용 rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination

답변3

다음과 같이 시도해 볼 수 있습니다.

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/Subdir1return Subdir1). 그런 다음 쉘을 사용할 수 있습니다버팀대 확장fo1새로 생성된 디렉토리에 여러 번 입력하고 복사하는 것을 방지합니다 .fo2new_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

답변4

디렉터리 구조가 예제와 정확히 같은 경우(즉, 모든 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

관련 정보