모든 파일을 파일 이름의 일부 이름을 딴 하위 디렉터리로 이동합니다. [중복]

모든 파일을 파일 이름의 일부 이름을 딴 하위 디렉터리로 이동합니다. [중복]

이름이 아티스트 이름과 앨범으로 구성된 많은 파일이 포함된 디렉토리가 있습니다. 예를 들면 다음과 같습니다. 여기에 이미지 설명을 입력하세요.

이제 작업은 각 파일을 살펴보고 아티스트 이름과 앨범 이름으로 명명된 디렉터리를 만든 다음 파일을 해당 디렉터리로 이동하는 것입니다.

최종 구조는 다음과 같아야 합니다. 여기에 이미지 설명을 입력하세요.

기본 쉘 명령만 사용하여 이를 수행하려면 어떻게 해야 합니까?

답변1

이것은 귀하가 요구하는 많은 내용에도 불구하고 대부분 귀하가 원하는 작업을 수행하므로 혼란스러운 부분이 있는 경우 알려주시면 설명하도록 노력하겠습니다.

#!/usr/bin/env bash

song_dir="$HOME/tmp/songs"
out_dir="$HOME/tmp/org_songs"

[[ ! -d "$out_dir" ]] && mkdir -p "$out_dir"

get_artist () {
    local a=($(tr '_' ' ' <<<"$1"))
    for i in "${a[@]}"; do
        if [[ $i =~ artiste.* ]]; then
            printf '%s\n' "${i#*=}"
            break
        fi
    done
}

get_album () {
    local a=($(tr '_' ' ' <<<"$1"))
    for i in "${a[@]}"; do
        if [[ $i =~ album.* ]]; then
            printf '%s\n' "${i#*=}"
            break
        fi
    done
}

get_song () {
    local a=($(tr '_' ' ' <<<"$1"))
    for i in "${a[@]}"; do
        if [[ $i =~ song.* ]]; then
            printf '%s\n' "${i#*=}"
            break
        fi
    done
}

for song in "${song_dir}/"*.mp3; do
    bname=$(basename "$song")
    artist=$(get_artist "$bname")
    album=$(get_album "$bname")
    sname=$(get_song "$bname")
    [[ ! -d "${out_dir}/${artist}/${album}" ]] && mkdir -p "${out_dir}/${artist}/${album}"
    cp "$song" "${out_dir}/${artist}/${album}/${sname}"
done

사용 중:

앞으로:

$ tree
.
├── script.sh
└── songs
    ├── artiste=linkin-park_album=meteora_id=02_song=Don't-stay.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Session.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Somewhere-I-Belong.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Bleed-It-Out.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Given-Up.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Leave-out-All-The-Rest.mp3
    ├── id=01_artiste=eminem_album=recovery_song=cold-wind-blows.mp3
    ├── id=01_artiste=eminem_album=recovery_song=on-fire.mp3
    └── id=01_artiste=eminem_album=recovery_song=talking-2-myself-(feat-kobe).mp3

1 directory, 10 files

뒤쪽에:

$ tree
.
├── org_songs
│   ├── eminem
│   │   └── recovery
│   │       ├── cold-wind-blows.mp3
│   │       ├── on-fire.mp3
│   │       └── talking-2-myself-(feat-kobe).mp3
│   └── linkin-park
│       ├── meteora
│       │   ├── Don't-stay.mp3
│       │   ├── Session.mp3
│       │   └── Somewhere-I-Belong.mp3
│       └── minutes-of-midnight
│           ├── Bleed-It-Out.mp3
│           ├── Given-Up.mp3
│           └── Leave-out-All-The-Rest.mp3
├── script.sh
└── songs
    ├── artiste=linkin-park_album=meteora_id=02_song=Don't-stay.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Session.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Somewhere-I-Belong.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Bleed-It-Out.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Given-Up.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Leave-out-All-The-Rest.mp3
    ├── id=01_artiste=eminem_album=recovery_song=cold-wind-blows.mp3
    ├── id=01_artiste=eminem_album=recovery_song=on-fire.mp3
    └── id=01_artiste=eminem_album=recovery_song=talking-2-myself-(feat-kobe).mp3

7 directories, 19 files

또한 파일을 이동하는 cp대신 파일 복사를 사용하고 있다는 점에 유의하세요 mv. 먼저 복사본을 만든 다음 모든 것이 정상적으로 작동하는 즉시 이전 파일을 삭제하는 것이 좋습니다. 그렇지 않으면 일부 데이터가 엉망이 되거나 손실될 위험이 있습니다.

관련 정보