Переместить все файлы в подкаталоги, названные в честь части имени файла [дубликат]

0
28.11.2018, 22:21
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для их перемещения. Я рекомендую просто сначала сделать копию, а затем удалить старые файлы, если все работает правильно. В противном случае вы рискуете испортить или потерять некоторые данные.

0
28.01.2020, 04:07

Теги

Похожие вопросы