b
나는 디렉토리에서 아무것도 복사하거나 이동하지 않고 디렉토리에 포함된 파일을 구성 하여 디렉토리의 구조와 동일하게 만드는 방법을 찾고 있습니다 a
( 와 동일한 파일을 포함하고 b
다른 방식으로 배열됨) a
. 이렇게 하면 다음 이미지와 같이 또는/및 명령의 mv
출력과 함께 명령 의 고급 사용을 모색할 수 있습니다.awk
sed
Errors a
다음과 같이 수정 없이 as 이전의 디렉토리를 모델링합니다 Errors b
.
. .
└── Errors a └── Errors b
├── Eltendorf ├── Eltendorf
│ ├── 2013 March 09.txt │ ├── 2013 March 09.txt
│ ├── 2014 November 07.txt │ ├── 2014 November 07.txt
│ ├── 2016 August 03.txt │ ├── 2016 August 03.txt
│ └── 2017 October 02.txt │ └── 2017 October 02.txt
├── Gettendorf ├── Gettendorf
│ ├── 2011 August 05.txt │ ├── 2011 August 05.txt
│ ├── 2014 October 02.txt │ ├── 2014 October 02.txt
│ ├── 2014 October 09.txt │ ├── 2014 October 09.txt
│ └── 2015 November 08.txt │ └── 2015 November 08.txt
├── Krensdorf ├── Krensdorf
│ ├── 2010 August 04.txt │ ├── 2010 August 04.txt
│ ├── 2010 November 04.txt │ ├── 2010 November 04.txt
│ └── 2012 August 09.txt │ └── 2012 August 09.txt
└── Ritzing └── Ritzing
├── 2013 March 01.txt ├── 2013 March 01.txt
├── 2013 March 02.txt ├── 2013 March 02.txt
├── 2013 March 03.txt ├── 2013 March 03.txt
└── 2018 November 02.txt └── 2018 November 02.txt
Errors c
원하는 대로 전후 의 콘텐츠 디렉터리를 다음과 같이 지정합니다 Errors d
.
. .
└── Errors c └── Errors d
├── Eltendorf ├── Eltendorf
│ ├── 2010 November 04.txt │ ├── 2013 March 09.txt
│ ├── 2013 March 02.txt │ ├── 2014 November 07.txt
│ ├── 2014 November 07.txt │ ├── 2016 August 03.txt
│ └── 2014 October 09.txt │ └── 2017 October 02.txt
├── Gettendorf ├── Gettendorf
│ ├── 2012 August 09.txt │ ├── 2011 August 05.txt
│ ├── 2013 March 03.txt │ ├── 2014 October 02.txt
│ ├── 2014 October 02.txt │ ├── 2014 October 09.txt
│ └── 2017 October 02.txt │ └── 2015 November 08.txt
├── Krensdorf ├── Krensdorf
│ ├── 2010 August 04.txt │ ├── 2010 August 04.txt
│ ├── 2013 March 01.txt │ ├── 2010 November 04.txt
│ ├── 2015 November 08.txt │ └── 2012 August 09.txt
│ └── 2018 November 02.txt └── Ritzing
└── Ritzing ├── 2013 March 01.txt
├── 2011 August 05.txt ├── 2013 March 02.txt
├── 2013 March 09.txt ├── 2013 March 03.txt
└── 2016 August 03.txt └── 2018 November 02.txt
그렇게 하면 디렉토리 내용을 복사하지 않고도 디렉토리가 c
디렉토리와 동일해져야 합니다 .a
a
답변1
찾기, sed, xargs, mkdir:
find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}
답변2
단순화를 위해 원본 데이터가 다음 디렉토리에 있다고 가정합니다 a
.
a
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4
b
와 동일한 파일을 포함하고 a
다른 디렉토리 구조로 구성된 디렉토리가 있습니다 .
b
├── d1
│ └── f3
├── d2
│ ├── f1
│ └── f2
└── d3
└── f4
에서 로 아무것도 복사하지 않고 의 계층 구조 b
와 일치하도록 파일을 재정렬하려면 다음을 수행합니다 .a
a
b
export orig=a dest=b
find "$orig" -type f -exec sh -c '
for file; do
target=$dest${file#$orig}
target=${target%/*}
mkdir -p -- "$target"
find "$dest" -type f -name "${file##*/}" \
-exec mv -i -- \{\} "$target/" \;
done
' mysh {} +
실제로 효율적이지 않은 이 코드는 다음과 같습니다( find
의 모든 파일에 대해 새 프로세스를 생성함 a
).
- 에서 모든 일반 파일을 검색합니다
a
. - 대상 디렉토리를 파일의 상위 디렉토리로 정의
a
하고b
, - 대상 디렉토리를 생성합니다(
makedir -p
기존 디렉토리에 대해 불평하지 않고 필요한 모든 상위 디렉토리도 생성합니다). b
현재 이름으로 명명된 모든 파일을 검색하여 대상 디렉터리로 이동합니다. 덮어쓰기 전에 의 서로 다른 하위 디렉터리에 있는 두 파일의 이름이 같은mv -i
경우 데이터 손실을 방지하기 위해 묻습니다 .b
그런 다음 다음 예에 없는 b
일반 파일이나 디렉터리를 제거할 수 있습니다 .d3
a
export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
target=$orig${1#$dest}
[ ! -e "$target" ]
' mysh {} \; -delete
최종 결과는 다음과 같습니다.
b
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4