답변:
다음과 같이 할 수 있습니다.
find . -type d > dirs.txt
디렉토리 목록을 생성 한 다음
xargs mkdir -p < dirs.txt
대상에 디렉터리를 만듭니다.
find . -type d -print0 >dirs.txt
및로 변경합니다 xargs -0 mkdir -p <dirs.txt
. 이렇게하면 두 명령 모두 공백 대신 구분자로 널을 사용합니다.
xargs
수백 또는 수천 개의 주문을 처리하기 시작할 때 시스템의 최대 명령 길이를 초과 할 수 있으므로주의해서 사용하십시오. (로 명령 길이 제한을 찾으십시오 getconf ARG_MAX
.) 디렉토리가 많으면 대신 출력을 반복하는 스크립트를 작성해야 할 수 있습니다.
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
--
표준 GNU 유틸리티 옵션 종결 자입니다. 그것은 "이봐 mkdir, 그 이후의 모든 인수는 플래그가 아니므로 '-'문자로 시작하더라도 파일 인수로 취급하십시오."라는 의미입니다.
다음은 rsync를 사용하는 간단한 솔루션입니다.
rsync -av -f"+ */" -f"- *" "$source" "$target"
rsync -a --include '*/' --exclude '*' "$source" "$target"
Linux에서 솔루션을 찾고 있는지 모르겠습니다. 그렇다면 다음을 시도해 볼 수 있습니다.
$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
이렇게하면 디렉토리 및 파일 속성이 복사되지만 파일 데이터는 복사되지 않습니다.
cp -R --attributes-only SOURCE DEST
그런 다음 관심이없는 경우 파일 속성을 삭제할 수 있습니다.
find DEST -type f -exec rm {} \;
대체 target_dir
및 source_dir
적절한 값 :
cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"
OSX + Ubuntu에서 테스트되었습니다.
Sergiy Kolodyazhnyy의 Python 스크립트가 파일이 아닌 폴더 만 복사에 게시 되었습니까? :
#!/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))
또는 쉘에서 :
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
참고 :
또 다른 접근 방식은 tree
강력한 옵션을 기반으로 디렉토리 트리를 매우 편리하게 탐색하는를 사용하는 것입니다. 디렉토리 전용, 빈 디렉토리 제외, 패턴이있는 이름 제외, 패턴이있는 이름 만 포함 등의 옵션이 있습니다. 체크 아웃man tree
장점 : 목록을 편집하거나 검토 할 수 있습니다. 또는 스크립팅을 많이하고 빈 디렉토리를 자주 생성하는 경우
접근 방식 :를 사용하여 디렉토리 목록을 만들고 tree
해당 목록을 인수 입력으로 사용mkdir
tree -dfi --noreport > some_dir_file.txt
-dfi
디렉토리 만 나열하고, 각 이름에 대한 전체 경로를 인쇄하고, 트리가 들여 쓰기 행을 인쇄하지 않도록합니다.
--noreport
출력 파일에 보풀이 포함되지 않도록하기 위해 트리 목록 끝에 파일 및 디렉토리 보고서 인쇄를 생략합니다.
그런 다음 빈 디렉토리를 원하는 대상으로 이동하여
xargs mkdir < some_dir_file.txt
Windows 컴퓨터에서 액세스 할 수있는 경우 / T 및 / E와 함께 xcopy를 사용하여 폴더 구조 만 복사 할 수 있습니다 (/ E에는 빈 폴더가 포함됨).
[편집하다!]
이것은 rsync를 사용하여 파일없이 디렉토리 구조를 다시 만듭니다. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
실제로 더 나을 수도 있습니다 :)
다음은 PHP의 솔루션입니다.
syncDirs.php
이 콘텐츠로 다음 과 같은 파일을 만듭니다 .
<?php
foreach (new DirectoryIterator($argv[1]) as $f) {
if($f->isDot() || !$f->isDir()) continue;
mkdir($argv[2].'/'.$f->getFilename(), $f->getPerms());
chown($argv[2].'/'.$f->getFilename(), $f->getOwner());
chgrp($argv[2].'/'.$f->getFilename(), $f->getGroup());
}
충분한 권한이있는 사용자로 실행하십시오.
sudo php syncDirs.php /var/source /var/destination