나는 디렉토리에서 아무것도 복사하거나 이동하지 않고 디렉토리 (디렉토리와 동일한 파일을 포함하고 다른 방식으로 배열됨) b
의 구조와 동일하도록 디렉토리에 포함된 파일을 구성하는 방법을 찾고 있습니다 . 이러한 방식으로 아래 그림에 표시된 대로 or/and 명령의 출력을 통해 명령의 일부 고급 사용법을 찾을 수 있습니다.a
b
a
mv
awk
sed
모델 디렉토리 앞의 as 및 it은 Errors a
다음과 같이 수정되지 않았습니다 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