디렉터리 a에서 복사하거나 이동하지 않고 디렉터리 b와 해당 하위 디렉터리 파일을 디렉터리 a와 동일하게 구성합니다.

디렉터리 a에서 복사하거나 이동하지 않고 디렉터리 b와 해당 하위 디렉터리 파일을 디렉터리 a와 동일하게 구성합니다.

나는 디렉토리에서 아무것도 복사하거나 이동하지 않고 디렉토리 (디렉토리와 동일한 파일을 포함하고 다른 방식으로 배열됨) b의 구조와 동일하도록 디렉토리에 포함된 파일을 구성하는 방법을 찾고 있습니다 . 이러한 방식으로 아래 그림에 표시된 대로 or/and 명령의 출력을 통해 명령의 일부 고급 사용법을 찾을 수 있습니다.abamvawksed

모델 디렉토리 앞의 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디렉터리와 동일해져야 합니다 .aa

답변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하지 않고 계층 구조와 일치 하도록 파일을 다시 정렬하려면 다음을 수행하세요 .aab

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

관련 정보