cp를 사용하여 다양한 수준의 하위 디렉터리를 제외하는 방법은 무엇입니까?

cp를 사용하여 다양한 수준의 하위 디렉터리를 제외하는 방법은 무엇입니까?

이것은 내 원래 게시물에 대한 후속 질문입니다.find & cp 명령은 첫 번째 수준 디렉터리를 복사하지 않습니다.

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

test folders
├── 1
│   ├── 1-1
│   ├── 1-2
│   └── 1-3
├── 2
│   ├── 2-1
│   ├── 2-2
│   └── 2-3
├── 3
│   ├── 3-1
│   ├── 3-2
│   └── 3-3
└── 4
    ├── 4-1
    ├── 4-2
    └── 4-3

16 directories, 0 files

find& 명령을 사용하여 cp모든 하위 폴더를 제외하고 첫 번째 수준 폴더인 1,2,3,4만 복사하려고 합니다.

├── 1
├── 2
├── 3
└── 4

작업 디렉토리는 입니다 /home/username/Downloads/test folders.

실패한 시도는 연결된 질문에 있습니다. 거기서 우리는 with 명령이 cpvisible 이라는 사실을 확인했습니다 .find-maxdepth

파일을 더 쉽게 복사 할 find수 있는 또 다른 명령이 있습니까 ? if 명령을 연결할 수 없는 것과 동일한 기능이 있습니까 ?cp-maxdepth-maxdepthcpfindcp

[편집]: 또한 첫 번째 수준 디렉터리인 1, 2, 3, 4만 복사하고 싶습니다. 파일을 복사하고 싶지 않습니다. 혼란을 드려 죄송합니다

답변1

파일이나 하위 디렉터리를 복사하지 않고 디렉터리만 복사하려는 경우 다음과 같이 쉽습니다.

terdon@oregano test folders $ tree
.
├── 1
│   ├── 1-1
│   ├── 1-2
│   ├── 1-3
│   ├── file-1
│   └── file-2
├── 2
│   ├── 2-1
│   ├── 2-2
│   ├── 2-3
│   ├── file-1
│   └── file-2
├── 3
│   ├── 3-1
│   ├── 3-2
│   ├── 3-3
│   ├── file-1
│   └── file-2
└── 4
    ├── 4-1
    ├── 4-2
    ├── 4-3
    ├── file-1
    └── file-2

17 directories, 8 files

위의 예를 사용하면 다음 명령을 사용하여 최상위 디렉터리를 다시 만들 수 있습니다.

terdon@oregano test folders $ find . -maxdepth 1 -type d -exec mkdir ../results/{} \;
mkdir: cannot create directory ‘../results/.’: File exists
$ tree ../results/
../results/
├── 1
├── 2
├── 3
└── 4

5 directories, 0 files

이 오류 메시지는 무시해도 됩니다. 이는 .현재 디렉터리 도 찾고 ../results/.이미 존재하는 현재 디렉터리를 생성하려고 시도하기 때문입니다.

최상위 파일도 복사하려면 다음 두 단계로 수행할 수 있습니다.

terdon@oregano test folders $ find . -maxdepth 1 -type d -exec mkdir ../results/{} \;
mkdir: cannot create directory ‘../results/.’: File exists
$ find . -maxdepth 2 -type f -exec cp {} ../results/{} \;

다음을 생성합니다.

$ tree ../results/
../results/
├── 1
│   ├── file-1
│   └── file-2
├── 2
│   ├── file-1
│   └── file-2
├── 3
│   ├── file-1
│   └── file-2
└── 4
    ├── file-1
    └── file-2

다음 방법을 통해 한 번에 이 작업을 수행할 수도 있습니다.

$ find . -maxdepth 1 -type d -exec sh -c 'mkdir ../results/$1 && cp {}/* ../results/$1' sh {} \;
mkdir: cannot create directory ‘../results/.’: File exists
cp: -r not specified; omitting directory './3/3-1'
cp: -r not specified; omitting directory './3/3-2'
cp: -r not specified; omitting directory './3/3-3'
cp: -r not specified; omitting directory './1/1-1'
cp: -r not specified; omitting directory './1/1-2'
cp: -r not specified; omitting directory './1/1-3'
cp: -r not specified; omitting directory './4/4-1'
cp: -r not specified; omitting directory './4/4-2'
cp: -r not specified; omitting directory './4/4-3'
cp: -r not specified; omitting directory './2/2-1'
cp: -r not specified; omitting directory './2/2-2'
cp: -r not specified; omitting directory './2/2-3'

cp없이 사용하기 때문에 -r파일만 복사됩니다. 이러한 경고가 표시되지만 무시해도 됩니다. 다음으로 리디렉션하여 음소거할 수도 있습니다 /dev/null.

find . -maxdepth 1 -type d -exec sh -c 'mkdir ../results/$1 && cp {}/* ../results/$1' sh {} \; 2>/dev/null

관련 정보