すべてのファイルをファイル名の一部の名前付きサブディレクトリに移動します。 [重複]

すべてのファイルをファイル名の一部の名前付きサブディレクトリに移動します。 [重複]

アーティスト名とアルバムからなる名前のファイルが多数含まれているディレクトリがあります。たとえば、次のようになります。 ここに画像の説明を入力してください。

作業は、各ファイルを見て、アーティスト名とアルバム名で名前付きディレクトリを作成し、ファイルをそのディレクトリに移動することです。

最終構造は次のようになります。 ここに画像の説明を入力してください。

デフォルトのシェルコマンドのみを使用してこれを行うにはどうすればよいですか?

ベストアンサー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。まず、コピーを作成し、すべてが正常に機能したらすぐに古いファイルを削除することをお勧めします。そうしないと、一部のデータが混乱したり失われたりする可能性があります。

おすすめ記事