증가하는 디렉터리의 파일을 하나의 디렉터리로 병합하는 방법

증가하는 디렉터리의 파일을 하나의 디렉터리로 병합하는 방법

다음 패턴을 따르는 디렉터리 구조가 있습니다.

- Dir 01 (Disc 1) \
  - Dir 01 (Disc 1).iso
- Dir 01 (Disc 2) \
  - Dir 01 (Disc 2).iso
- Dir 01 (Disc 3) \
  - Dir 01 (Disc 3).iso

- Dir 02 (Disc 1) \
  - Dir 02 (Disc 1).iso
- Dir 02 (Disc 2) \
  - Dir 02 (Disc 2).iso
 
- Dir 02 (Disc 1) (A) \
  - Dir 02 (Disc 1) (A).iso
- Dir 02 (Disc 2) (A) \
  - Dir 02 (Disc 2) (A).iso

내 목표는 다음과 같은 구조로 끝나는 것입니다.

- Dir 01 \
  - Dir 01 (Disc 1).iso
  - Dir 01 (Disc 2).iso
  - Dir 01 (Disc 3).iso

- Dir 02 \
  - Dir 02 (Disc 1).iso
  - Dir 02 (Disc 2).iso

- Dir 02 (A) \
  - Dir 02 (Disc 1) (A).iso
  - Dir 02 (Disc 2) (A).iso

이러한 디렉터리를 반복하고 파일 이름을 일치시키고 모든 것을 제자리로 이동하는 방법이 있어야 한다는 것을 알고 있지만 스크립트를 작성하는 방법을 알 수 없습니다. 어떤 조언이라도 대단히 감사하겠습니다.

답변1

귀하가 원하는 트리 구조를 지정했다는 점을 고려하여 이를 고수하겠습니다. 그러나 디렉터리 및 파일 이름에서 어떤 경우에도 공백을 피하는 것이 중요하다는 점은 아무리 강조해도 지나치지 않습니다. 공백이 필요하지 않고 그 자리에 "_"를 사용할 수도 있는 경우 알려주시면 업데이트된 트리 구조를 제공하겠습니다.

초기 트리:

tree
.
├── Dir 01 (Disc 1)
│   └── Dir 01 (Disc 1).iso
├── Dir 01 (Disc 2)
│   └── Dir 01 (Disc 2).iso
├── Dir 01 (Disc 3)
│   └── Dir 01 (Disc 3).iso
├── Dir 02 (Disc 1)
│   └── Dir 02 (Disc 1).iso
├── Dir 02 (Disc 1) (A)
│   └── Dir 02 (Disc 1) (A).iso
├── Dir 02 (Disc 2)
│   └── Dir 02 (Disc 2).iso
└── Dir 02 (Disc 2) (A)
    └── Dir 02 (Disc 2) (A).iso

8 directories, 7 files

명령어로 재구성 - 댓글을 남길 수 있으나 반드시 명령어로 복사하여 붙여넣으세요.


find . -type f -iname '*iso' -exec bash -c '
    var="$1" ;                                                   # found filename variable
    bad_dir=$(dirname "$var" | grep -i "disc");                  # old directory name variable
    good_dir=$(echo "$bad_dir" | cut -d" " -f1,2,5- ) ;          # Only acts on dirnames with "disc"
     
    if [[ -n $good_dir ]] ; then                           
       mkdir -p "$good_dir" ;                                    # creates new proper dir  
       mv "$var" "$good_dir" ;                                   # mv file to new dir
       rmdir "$bad_dir"                                          # removes old bad dir
    fi 
' bash {} \;                 

새 디렉터리 트리 구조를 테스트합니다.

tree .
.
├── Dir 01
│   ├── Dir 01 (Disc 1).iso
│   ├── Dir 01 (Disc 2).iso
│   └── Dir 01 (Disc 3).iso
├── Dir 02
│   ├── Dir 02 (Disc 1).iso
│   └── Dir 02 (Disc 2).iso
└── Dir 02 (A)
    ├── Dir 02 (Disc 1) (A).iso
    └── Dir 02 (Disc 2) (A).iso

4 directories, 7 files

노트: 명령을 다시 실행해도 현재 구조가 파괴되지 않는지 확인하는 검사를 추가했습니다. 또한 위의 내용은 다음과 같이 더 복잡한 파일 및 디렉터리 이름에도 적용됩니다.

├── Dir 01 (Disc 3) (A) (B) (C)
    └── Dir 01 (Disc 3) (A) (B) (C).iso
├── Dir 02 (Disc 1) (A) (B)
    └── Dir 02 (Disc 1) (A) (B).iso

다음과 같이 재구성됩니다.

├── Dir 01 (A) (B) (C)
│   └── Dir 01 (Disc 3) (A) (B) (C).iso
└── Dir 02 (A) (B)
    └── Dir 02 (Disc 1) (A) (B).iso

답변2

그리고 zsh:

autoload -U zmv
mkmv() { mkdir -p -- $2:h && mv -- "$@"; }
zmv -P mkmv -n '(*) [(]Disc <->[)](*)/(*.iso)' '$1$2/$3'

( -n무슨 일이 일어나는지 보여주기 위해 연습 실행을 수행할 위치)

이는 다음을 제공합니다:

mkmv 'Dir 01 (Disc 1)/Dir 01 (Disc 1).iso' 'Dir 01/Dir 01 (Disc 1).iso'
mkmv 'Dir 01 (Disc 2)/Dir 01 (Disc 2).iso' 'Dir 01/Dir 01 (Disc 2).iso'
mkmv 'Dir 01 (Disc 3)/Dir 01 (Disc 3).iso' 'Dir 01/Dir 01 (Disc 3).iso'
mkmv 'Dir 02 (Disc 1) (A)/Dir 02 (Disc 1) (A).iso' 'Dir 02 (A)/Dir 02 (Disc 1) (A).iso'
mkmv 'Dir 02 (Disc 1)/Dir 02 (Disc 1).iso' 'Dir 02/Dir 02 (Disc 1).iso'
mkmv 'Dir 02 (Disc 2) (A)/Dir 02 (Disc 2) (A).iso' 'Dir 02 (A)/Dir 02 (Disc 2) (A).iso'
mkmv 'Dir 02 (Disc 2)/Dir 02 (Disc 2).iso' 'Dir 02/Dir 02 (Disc 2).iso'

여기서는 mkmv이전에 대상의 상위 디렉터리를 생성한 후 파일을 이동하는 함수로 정의되었습니다.

관련 정보