파일이 아닌 폴더 만 복사 하시겠습니까?


16

전체 디렉토리를 복사하고 폴더 만 복사하는 방법이 있습니까? 내 디렉토리 어딘가에 손상된 파일이있어 하드 디스크가 고장납니다.

따라서 손상된 파일을 다른 하드 디스크에 복사하는 대신 수백 개의 폴더를 검색하는 스크립트가 있으므로 수동으로 폴더를 모두 만들고 싶지 않기 때문에 폴더 만 복사하고 싶었습니다.

cp 설명서를 검색했지만 아무것도 볼 수 없습니다 (보고 싶을 수도 있습니다)

고장난 HDD에이 구조가 있다고 가정 해보십시오.

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

내가 원하는 것은 파일이 아닌 디렉토리 구조입니다.

그래서 나는 새로운 HDD로 끝날 것입니다 :

dir1
    dir2
        dir4
dir3

누군가가 속임수를 알고 싶어!


디렉토리 strucure를 복사하고 싶거나 현재 작업 디렉토리의 파일을 제외하고 싶습니까 (더 깊은 하위 디렉토리의 다른 모든 파일은 게임 임)?
Oli

예를 추가했습니다. 혼란을 끼쳐 드려 죄송합니다
Shannon

1
참고로 rsync디렉토리 구조를 복사하고 권한 및 속성을 유지하는 데 사용합니다] ( stackoverflow.com/a/9242883/52074 ). 일반을 사용하면 mkdir -p 권한과 속성이 유지되지 않습니다 .
Trevor Boyd Smith

답변:


15

디렉토리 스켈레톤을 미러하고 파일을 복사하지 않으려면 다음을 수행하십시오.

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

무슨 일이야?

전화가 많이 find -type d -exec mkdir -p "/path/to/backup/{}" \;걸리기 때문에 이와 같이하지 않았습니다 mkdir. 약간의 테스트로이를 신속하게 증명할 수 있습니다. 다음은 테스트 트리와 두 명령을 비교하기 위해 실행 한 것입니다.

$ tree
.
├── dir1
│   ├── dir2
│   │   └── dir3
│   ├── dir7
│   └── dir8
└── dir9
    └── dir0

$ pr -m -t <(find -type d) <(find -type d -links 2)
.                               ./dir1/dir8
./dir1                          ./dir1/dir2/dir3
./dir1/dir8                     ./dir1/dir7
./dir1/dir2                     ./dir9/dir0
./dir1/dir2/dir3
./dir1/dir7
./dir9                  
./dir9/dir0 

그리고 그것은 수천 개의 디렉토리를 가진 실제 솔루션에서만 나아질 것입니다.


이것은 멍청한 짓이지만 백업에 복사하기 위해 이전 디렉토리를 어떻게 찾고 있습니까? 여기서 한 가지 경로 만 볼 수 있습니다
Shannon

경로를 지정하지 않으면 find현재 작업 디렉토리를 시작점으로 사용하십시오. 다른 경로를 사용하려면 다음 구문을 사용하십시오.find /path/to/search/ -type.....
Oli

그래서 복사, 실행하려는 골격이 포함 된 특정 폴더로 디렉토리를 설정했는데 find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;모두 괜찮습니까? 시간이 좀 걸리는 것 같습니다 : /
Shannon

나는 이것을 정상적인 터미널에서 바로 실행합니까?
Shannon

1
둘 다 find의 exec 절에만 적용됩니다. {}는 현재 "발견 된"파일 이름과 \를 의미합니다. 절을 끝내기위한 탈출구 일뿐입니다. 그것의 모습으로 더 좋은 당신의 코드까지의 추가가 "있다, 나는 확신 ...해야 읽기 :find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
OLI

2

파이썬 원 라이너로 매우 쉽게 수행 할 수 있습니다.

bash-4.3$ tree
.
├── ABC
├── set_pathname_icon.py
├── subdir1
│   ├── file1.abc
│   └── file2.abc
├── subdir2
│   ├── file1.abc
│   └── file2.abc
└── subdir3
    └── subdir4
        └── file1.txt

4 directories, 7 files
bash-4.3$ python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination
bash-4.3$ tree ~/new_destination
/home/xieerqi/new_destination
├── subdir1
├── subdir2
└── subdir3
    └── subdir4

스크립트로 다음과 같이 다시 작성할 수 있습니다.

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.