한 위치에서 다른 위치로 폴더 구조 (파일 없음) 복사


94

멀티 테라 바이트 파일 서버 구조의 복제본을 만들고 싶습니다. cp --parents가 파일을 이동할 수 있고 부모 구조라는 것을 알고 있지만 디렉터리 구조를 그대로 복사 할 수있는 방법이 있습니까?

Linux 시스템에 복사하고 싶습니다. 파일 서버가 CIFS에 마운트되어 있습니다.



위의 댓글 게시물의 rsync 솔루션이 더 깔끔해 보입니다.
YE

답변:


158

다음과 같이 할 수 있습니다.

find . -type d > dirs.txt

디렉토리 목록을 생성 한 다음

xargs mkdir -p < dirs.txt

대상에 디렉터리를 만듭니다.


8
이 솔루션은 디렉토리 이름에 공백이 있으면 작동하지 않습니다.
Jealie

29
@Jealie 명령을 find . -type d -print0 >dirs.txt및로 변경합니다 xargs -0 mkdir -p <dirs.txt. 이렇게하면 두 명령 모두 공백 대신 구분자로 널을 사용합니다.
user1207177 2015-04-03

3
xargs수백 또는 수천 개의 주문을 처리하기 시작할 때 시스템의 최대 명령 길이를 초과 할 수 있으므로주의해서 사용하십시오. (로 명령 길이 제한을 찾으십시오 getconf ARG_MAX.) 디렉토리가 많으면 대신 출력을 반복하는 스크립트를 작성해야 할 수 있습니다.
palswim

1
그리고 권한 및 속성은 어떻게 유지됩니까?
Ashish Karpe

3
@TrevorBoydSmith : 귀하의 의견에 감사드립니다. 원래 질문에는 권한, 소유권 또는 속성을 보존해야하는 필요성에 대해 언급하지 않았습니다. 그렇게하려면 언급했듯이 다른 솔루션이 필요하지만 위의 내용은 제시된 질문에 답하기에 충분합니다.
Greg Hewgill

79
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;

3
찾기와 함께 최고의 대답. 그렇지 않으면 이 SO 질문rsync 에서 Chen Levy 답변의 솔루션을 시도 할 수 있습니다
Mat M

3
-mkdir의 옵션은 무엇입니까?
Bruce_Warrior

9
--표준 GNU 유틸리티 옵션 종결 자입니다. 그것은 "이봐 mkdir, 그 이후의 모든 인수는 플래그가 아니므로 '-'문자로 시작하더라도 파일 인수로 취급하십시오."라는 의미입니다.
amphetamachine

4
이 대답은 또한 디렉토리 권한과 속성을 유지하지 않습니다 . 사용 rynsc 사용 권한을 보존하고 속성에
트레버 보이드 스미스

35

다음은 rsync를 사용하는 간단한 솔루션입니다.

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • 한 줄
  • 공백 문제 없음
  • 권한 유지

이 솔루션을 찾았습니다.


10
동일하지만 더 읽기 rsync -a --include '*/' --exclude '*' "$source" "$target"
Sylvain

1
이 솔루션의 문제는 내 폴더에 수천 개의 파일이 포함되어 있으며 rsync는 수십 개의 폴더를 동기화하는 데 오래 걸립니다.
Christopher K.

6

Linux에서 솔루션을 찾고 있는지 모르겠습니다. 그렇다면 다음을 시도해 볼 수 있습니다.

$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir

cpio가 적어도 당신이 지정한 매개 변수로 작동하지 않는 것 같습니다.
r00fus 2010

@ r00fus-cpio 매뉴얼을 읽거나 gnu.org/software/cpio를
zerodin

6

이렇게하면 디렉토리 및 파일 속성이 복사되지만 파일 데이터는 복사되지 않습니다.

cp -R --attributes-only SOURCE DEST

그런 다음 관심이없는 경우 파일 속성을 삭제할 수 있습니다.

find DEST -type f -exec rm {} \;

1
훌륭 하겠지만 소유권, 타임 스탬프 및 권한 저장에 대해 언급하는 것을 잊었습니다. 따라서 Win7 / cygwin에서 엉망이되었습니다. NULL_SID 사용자, 잘못된 권한 순서, 권한 편집 불가 등 생성 된 파일 구조에 액세스 할 수 없습니다.
WebComer

1
실제 작업을 위해 Windows를 사용하려는 사람에게 책임이 있다고 생각해야합니다.
tripleee

cp -R --attributes-only --preserve = all --parents -v SOURCE DEST
Gábor

2

다음 솔루션은 다양한 환경에서 저에게 잘 맞았습니다.

sourceDir="some/directory"
targetDir="any/other/directory"

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p

2

이것은 작동합니다 :

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"

SOURCE_DIR 및 DEST_DIR을 바꾸십시오.


2

이것은 공백 문제도 해결합니다.

원본 / 소스 디렉토리에서 :

find . -type d -exec echo "'{}'" \; > dirs2.txt

그런 다음 새로 만든 디렉토리에서 다시 만듭니다.

mkdir -p <../<SOURCEDIR>/dirs2.txt

1

대체 target_dirsource_dir적절한 값 :

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"

OSX + Ubuntu에서 테스트되었습니다.


0

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

참고 :


0

또 다른 접근 방식은 tree강력한 옵션을 기반으로 디렉토리 트리를 매우 편리하게 탐색하는를 사용하는 것입니다. 디렉토리 전용, 빈 디렉토리 제외, 패턴이있는 이름 제외, 패턴이있는 이름 만 포함 등의 옵션이 있습니다. 체크 아웃man tree

장점 : 목록을 편집하거나 검토 할 수 있습니다. 또는 스크립팅을 많이하고 빈 디렉토리를 자주 생성하는 경우

접근 방식 :를 사용하여 디렉토리 목록을 만들고 tree해당 목록을 인수 입력으로 사용mkdir

tree -dfi --noreport > some_dir_file.txt

-dfi 디렉토리 만 나열하고, 각 이름에 대한 전체 경로를 인쇄하고, 트리가 들여 쓰기 행을 인쇄하지 않도록합니다.

--noreport 출력 파일에 보풀이 포함되지 않도록하기 위해 트리 목록 끝에 파일 및 디렉토리 보고서 인쇄를 생략합니다.

그런 다음 빈 디렉토리를 원하는 대상으로 이동하여

xargs mkdir < some_dir_file.txt

0
find source/ -type f  | rsync -a --exclude-from - source/ target/

관련 권한 및 소유권이있는 디렉토리 만 복사


0

1 라인 솔루션 :

find . -type d -exec mkdir -p /path/to/copy/directory/tree/{} \;

-1

Windows 컴퓨터에서 액세스 할 수있는 경우 / T 및 / E와 함께 xcopy를 사용하여 폴더 구조 만 복사 할 수 있습니다 (/ E에는 빈 폴더가 포함됨).

http://ss64.com/nt/xcopy.html

[편집하다!]

이것은 rsync를 사용하여 파일없이 디렉토리 구조를 다시 만듭니다. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

실제로 더 나을 수도 있습니다 :)


1
불행히도 CIFS 제공 파일 서버는 창을 실행하지 않으므로 win 명령에서 할 수 없습니다.
r00fus 2010

감사합니다. rsync 방법은 저에게 완벽하게 잘 작동했습니다. 디렉토리 이름의 공백과도 호환됩니다.
Glutanimate 2012

-1

다음은 PHP의 솔루션입니다.

  • 디렉터리를 복사합니다 (재귀 적이 아니라 한 수준 만)
  • 권한 유지
  • rsync 솔루션과 달리 수천 개의 파일이 포함 된 디렉토리에서도 폴더로 이동하지 않기 때문에 빠릅니다.
  • 공백에 문제가 없습니다
  • 읽고 조정하기 쉬워야합니다.

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


PHP를 좋아할 필요도없고 사용할 필요도 없습니다. 그러나 OP는 특정 언어로 된 솔루션을 원하는지 여부를 지정하지 않았으며 웹의 80 %가 PHP를 사용하기 때문에 PHP가 많은 Linux 시스템에 어쨌든 설치됩니다 ( w3techs.com/technologies/details/pl- php / all / all ).
Christopher K.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.