ディレクトリ階層を平面化し、新しいディレクトリ名にディレクトリ名を保存します。

ディレクトリ階層を平面化し、新しいディレクトリ名にディレクトリ名を保存します。

私は基本的にここで始めたいと思います:

.
├── Alan Walker
│   ├── Different World
│   │   ├── 01 Intro.mp3
│   │   ├── 02 Lost Control.mp3
│   │   └── cover.jpg
│   └── Same World
│       ├── 01 Intro.mp3
│       └── 02 Found Control.mp3
├── Aurora
│   └── Infections Of A Different Kind Step 1
│       ├── 01 Queendom.lrc
│       ├── 02 Forgotten Love.lrc
│       └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses
    └── Use Your Illusion I
        ├── 01 Right Next Door To Hell.lrc
        ├── 01 Right Next Door To Hell.mp3
        ├── 02 Dust N' Bones.lrc
        └── 02 Dust N' Bones.mp3

これに関して:

.
├── Alan Walker - Different World
│   ├── 01 Intro.mp3
│   ├── 02 Lost Control.mp3
│   └── cover.jpg
├── Alan Walker - Same World
│   ├── 01 Intro.mp3
│   └── 02 Found Control.mp3
├── Aurora - Infections Of A Different Kind Step 1
│   ├── 01 Queendom.lrc
│   ├── 02 Forgotten Love.lrc
│   └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses - Use Your Illusion I
    ├── 01 Right Next Door To Hell.lrc
    ├── 01 Right Next Door To Hell.mp3
    ├── 02 Dust N' Bones.lrc
    └── 02 Dust N' Bones.mp3

私が見つけた既存のソリューションには、ディレクトリ自体の名前を変更することは含まれていません。 zmvでこれを行うことができればいいでしょうが、どうすればいいかわかりません。

ベストアンサー1

たぶんこんなことはありませんか?

#!/bin/sh

for topdir in */; do
    topdir_name=$( basename "$topdir" )

    for subdir in "$topdir"/*/; do
        subdir_name=$( basename "$subdir" )

        newdir="$topdir_name - $subdir_name"
        if mkdir "$newdir"; then
            mv "$subdir"/* "$newdir"
            rmdir "$subdir"
        fi
    done

    rmdir "$topdir"
done

これは、現在のディレクトリのすべての最上位ディレクトリ(バンド名)を繰り返します。これらの各ディレクトリに対して、対応するサブディレクトリ(アルバム名)を繰り返します。バンド名とアルバム名のペアごとに新しいディレクトリが作成され、サブディレクトリのファイルがそのディレクトリに移動されます。アルバムサブディレクトリは、元のバンドのトップレベルディレクトリと同様に処理後に削除されます。

rmdirディレクトリに隠しファイル名が含まれている場合、または新しいディレクトリが作成されない場合、呼び出しは失敗します。

完全にテストされていないコードです。ファイルのバックアップコピーから実行します。

おすすめ記事