다음 패턴을 따르는 디렉터리 구조가 있습니다.
- 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
이전에 대상의 상위 디렉터리를 생성한 후 파일을 이동하는 함수로 정의되었습니다.