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

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

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

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

모든 하위 디렉터리(Subdir1, Subdir2, Subdir3)를 새 폴더에 복사하고 싶습니다. 하지만 fo1 및 fo2 폴더만 새 위치에 복사하려면 어떻게 해야 합니까?

답변1

사용 rsync:

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

답변2

가장 좋은 옵션은 글로브와 cp해당 --parents옵션을 사용하는 것입니다. 귀하의 경우:

cp -nvr --parents -- Main_Dir/*/fo{1,2} Destination/

바라보다:

gniourf@somewhere$ mkdir -pv Main_Dir/Subdir{1..3}/f{o{1,2},03}
mkdir: created directory `Main_Dir'
mkdir: created directory `Main_Dir/Subdir1'
mkdir: created directory `Main_Dir/Subdir1/fo1'
mkdir: created directory `Main_Dir/Subdir1/fo2'
mkdir: created directory `Main_Dir/Subdir1/f03'
mkdir: created directory `Main_Dir/Subdir2'
mkdir: created directory `Main_Dir/Subdir2/fo1'
mkdir: created directory `Main_Dir/Subdir2/fo2'
mkdir: created directory `Main_Dir/Subdir2/f03'
mkdir: created directory `Main_Dir/Subdir3'
mkdir: created directory `Main_Dir/Subdir3/fo1'
mkdir: created directory `Main_Dir/Subdir3/fo2'
mkdir: created directory `Main_Dir/Subdir3/f03'
gniourf@somewhere$ tree Main_Dir/
Main_Dir/
|-- Subdir1
|   |-- f03
|   |-- fo1
|   `-- fo2
|-- Subdir2
|   |-- f03
|   |-- fo1
|   `-- fo2
`-- Subdir3
    |-- f03
    |-- fo1
    `-- fo2

12 directories, 0 files
gniourf@somewhere$ mkdir Destination
gniourf@somewhere$ cp -nvr --parents -- Main_Dir/*/fo{1,2} Destination/
Main_Dir -> Destination/Main_Dir
Main_Dir/Subdir1 -> Destination/Main_Dir/Subdir1
`Main_Dir/Subdir1/fo1' -> `Destination/Main_Dir/Subdir1/fo1'
Main_Dir/Subdir2 -> Destination/Main_Dir/Subdir2
`Main_Dir/Subdir2/fo1' -> `Destination/Main_Dir/Subdir2/fo1'
Main_Dir/Subdir3 -> Destination/Main_Dir/Subdir3
`Main_Dir/Subdir3/fo1' -> `Destination/Main_Dir/Subdir3/fo1'
`Main_Dir/Subdir1/fo2' -> `Destination/Main_Dir/Subdir1/fo2'
`Main_Dir/Subdir2/fo2' -> `Destination/Main_Dir/Subdir2/fo2'
`Main_Dir/Subdir3/fo2' -> `Destination/Main_Dir/Subdir3/fo2'
gniourf@somewhere$ tree Destination
Destination
`-- Main_Dir
    |-- Subdir1
    |   |-- fo1
    |   `-- fo2
    |-- Subdir2
    |   |-- fo1
    |   `-- fo2
    `-- Subdir3
        |-- fo1
        `-- fo2

10 directories, 0 files
gniourf@somewhere$ # Done!

반드시 스위치 --parent와 함께 옵션을 사용하세요 -r. 내가 사용한 옵션 -v은 명령이 장황하고(무엇을 하는지 보여줌) 옵션은 -n다음과 같습니다.아니 클로버기존 파일을 덮어쓰지 않도록 합니다(저는 이 파일을 매우 자주 사용합니다!).

디렉토리에 넣지 않으려면 Main_DirMain_Dir 내에서 직접 수행하십시오.

gniourf@somewhere$ mkdir -p Main_Dir/Subdir{1..3}/f{o{1,2},03} Destination
gniourf@somewhere$ cd Main_Dir/
gniourf@somewhere$ cp -nvr --parents -- */fo{1,2} ../Destination
Subdir1 -> ../Destination/Subdir1
`Subdir1/fo1' -> `../Destination/Subdir1/fo1'
Subdir2 -> ../Destination/Subdir2
`Subdir2/fo1' -> `../Destination/Subdir2/fo1'
Subdir3 -> ../Destination/Subdir3
`Subdir3/fo1' -> `../Destination/Subdir3/fo1'
`Subdir1/fo2' -> `../Destination/Subdir1/fo2'
`Subdir2/fo2' -> `../Destination/Subdir2/fo2'
`Subdir3/fo2' -> `../Destination/Subdir3/fo2'
gniourf@somewhere$ cd ..
gniourf@somewhere$ tree Destination/
Destination/
|-- Subdir1
|   |-- fo1
|   `-- fo2
|-- Subdir2
|   |-- fo1
|   `-- fo2
`-- Subdir3
    |-- fo1
    `-- fo2

9 directories, 0 files
gniourf@somewhere$ 

답변3

귀하의 경우 fo1, fo2, fo3 폴더의 이름이 다른 경우에만 가능합니다. 한 폴더에 동일한 이름을 가진 3개의 폴더가 있을 수 없기 때문입니다. 따라서 다음과 같이 보인다면:

user@host:~/test/1# find
.
./main
./main/sub1
./main/sub1/fo3
./main/sub1/fo1
./main/sub1/fo2
./main/sub2
./main/sub2/fo6
./main/sub2/fo4
./main/sub2/fo5
./main/sub3
./main/sub3/fo9
./main/sub3/fo8
./main/sub3/fo7

... 다음 방법으로 복사할 수 있습니다(하위 폴더만).

user@host:~/test/1# cp -R main/*/fo* ../2/

이제 ../2/다음과 같습니다.

user@host:~/test/1# cd ../2/
user@host:~/test/2# ls
fo1  fo2  fo3  fo4  fo5  fo6  fo7  fo8  fo9

관련 정보