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

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

b나는 디렉토리에서 아무것도 복사하거나 이동하지 않고 디렉토리에 포함된 파일을 구성 하여 디렉토리의 구조와 동일하게 만드는 방법을 찾고 있습니다 a( 와 동일한 파일을 포함하고 b다른 방식으로 배열됨) a. 이렇게 하면 다음 이미지와 같이 또는/및 명령의 mv출력과 함께 명령 의 고급 사용을 모색할 수 있습니다.awksed

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디렉토리와 동일해져야 합니다 .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일반 파일이나 디렉터리를 제거할 수 있습니다 .d3a

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

관련 정보