다음이 있다고 가정해 보겠습니다.
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