파일을 복사하지 않고 두 디렉터리를 병합합니다.

파일을 복사하지 않고 두 디렉터리를 병합합니다.

다음이 있다고 가정해 보겠습니다.

Folder A
    C1
        file a
    A2

Folder B
     C1
     B2
         file b
     B3

내가 원하는 것은 이 두 폴더를 병합하는 것입니다. 그러면 다음이 제공됩니다.

Folder C
    C1
    A2
    B2
    B3

file a와 는 쓰지 않았으니 참고해주세요 file b. 스키마를 병합하고 싶습니다. 각 저장소에는 서로 다른 파일이 포함되어 있으며 해당 파일을 병합 디렉터리에 추가하고 싶지 않습니다. 결과적으로는 mv Folder\ A/* Folder\ B충분하지 않습니다.

이것을 할 수 있는 방법이 있나요?

답변1

find글쎄, 당신은 exec 를 가질 수 있습니다 mkdir.

cd /A/
find -type d -exec mkdir -p /C/{} \;

또는 귀하의 예와 같이 구조가 평평한 경우에는find

cd /A/
for dir in */
do
    mkdir -p /C/"$dir"
done

두 경우 모두 에 대해서도 동일합니다 cd /B/.

답변2

동일한 디렉토리 구조를 생성하려는 경우 find기존 디렉토리 트리를 트래버스하고 mkdir각 하위 디렉토리에서 올바른 매개변수를 사용하여 호출할 수 있습니다. mkdir -p기존 디렉터리를 자동으로 건너뛰기 위해 호출됩니다 .

cd 'Folder A'
find . -type d -exec mkdir -p '/path/to/Folder C/{} '\;
cd 'Folder B'
find . -type d -exec mkdir -p '/path/to/Folder C/{} '\;

zsh에서는 , 가 Folder A동일한 디렉토리의 하위 디렉토리 Folder B라고 가정합니다.Folder C

mkdir -p Folder\ [AB]/**/*(/e\''REPLY=Folder\ C/${REPLY#*/}'\')

파일 권한을 사용하여 디렉터리 계층 구조를 재현하려면 rsync를 호출하고 일반 파일이 아닌 디렉터리만 포함하는 필터를 제공할 수 있습니다. /소스 디렉토리의 끝에 포함시켜 별도 의 /path/to/Folder C생성 작업 없이 해당 내용이 바로 아래에 복사되도록 하세요 /path/to/Folder C/path/to/Folder A.

rsync -a --include='*/' --exclude='*' '/path/to/Folder A/' '/path/to/Folder B/' '/path/to/Folder C'

답변3

나는 이렇게 할 것이다:

$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
           sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}

세부 사항

그러면 "Folder A" 및 "Folder B" 아래에 다음과 같은 하위 디렉터리 목록이 생성됩니다.

Folder A/A2
Folder A/C1
Folder B/B2
Folder B/B3
Folder B/C1

이 명령을 통해 출력을 파이프하면 sed"Folder.." 비트가 제거됩니다.

sed 's#[^/]\+/##'

결과는 다음과 같습니다.

A2
C1
B2
B3
C1

노트:위의 sed내용은 왼쪽부터 살펴보고 첫 번째 슬래시까지 슬래시가 아닌 모든 항목을 찾은 다음 해당 문자를 원래의 문자로 대체하여 본질적으로 제거합니다.

이 시점에서는 이 반복 작업을 완료하는 mkdir데 사용할 수 있도록 "폴더 C" 디렉터리에만 있으면 됩니다 .xargs

xargs -I{} mkdir -p "Folder C"/{}

이는 as 의 각 매개변수를 {}다음 명령에 있는 해당 매개변수로 바꾸는 것을 의미합니다 {}.

견본:

$ tree Folder\ {A,B,C}
Folder A
|-- A2
`-- C1
    `-- filea
Folder B
|-- B2
|   `-- fileb
|-- B3
`-- C1
Folder C

노트:"폴더 C"가 비어 있으면 시작하십시오.

이제 다음 명령을 실행합니다.

$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
           sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}

우리에게는 다음이 남았습니다.

$ tree Folder\ C
Folder C
|-- A2
|-- B2
|-- B3
`-- C1

관련 정보