新しいディレクトリ名でディレクトリ名を保持するディレクトリ階層の平坦化


7

私は基本的にこれから行きたいです:

.
├── 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で実行できると便利ですが、方法がわかりません。


2
完全な解決策ではないので、答えeasytagはありません。これは可能ですが、オーディオファイルに対してのみです-カバーなどが移動するとは思わない
rvs

2
1つのアーティストディレクトリ内に、特定のアーティストのアルバムが複数存在する可能性はありますか?構造は常に3レベルの深さですか?
nohillside

1
@nohillsideはい、アーティストには複数のアルバムが存在する場合があります。そして、はい、構造は常に3レベルの深さです。
aksh1618

回答:


9

Zsh

未テスト:

zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)

2行目は、空のディレクトリをすべて削除します。以前にファイルがなかったディレクトリも削除されます。mv移動元のディレクトリを記録するカスタムラッパーを使用してこれを回避することができます。

これは、現在のディレクトリ内のディレクトリへのシンボリックリンクを通過することに注意してください。

Linux名前変更ユーティリティ

未テスト。

rename / ' - ' */*/
rmdir -- */ 2>/dev/null

これは、現在のディレクトリおよびそのサブディレクトリ内のディレクトリへのシンボリックリンクを通過することに注意してください。2行目は、空のディレクトリをすべて削除します。以前にファイルがなかったディレクトリも削除されます。

Perl名前変更スクリプト

未テスト。

prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null

これは、現在のディレクトリおよびそのサブディレクトリ内のディレクトリへのシンボリックリンクを通過することに注意してください。2行目は、空のディレクトリをすべて削除します。以前にファイルがなかったディレクトリも削除されます。

次に、名前を変更したディレクトリのみを削除する、より複雑な方法を示します。再び、テストされていません。

prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/

12

このような何か?

#!/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任意のディレクトリには、隠されたファイル名が含まれている場合、呼び出しは失敗しますか、新しいディレクトリのいずれかを作成することに失敗した場合。

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


つまり、はい、何かが機能しますが、ターミナルから簡単に実行できる1行または2行のソリューションを探しています。一部のfind / sed / zmvマジック:)
aksh1618

10
スクリプトにotを入れると、-boom-はワンライナーになります。
Hans-Martin Mosner、

4

戦略的に、ファイルを移動するのではなく、現在の構造をそのままにして、必要な新しい構造へのリンクを作成することを検討しましたか?

戦術的には、この仕事をするパターンは次のようになります。

find . -mindepth 2 -maxdepth 2 -type d -print0 | xargs -0n1 bash -c \
  'b=$(basename "$(dirname "$1")"); a=$(basename "$1"); echo ln -s "$1" "$b-$a"' {}
  • find現在の作業ディレクトリからちょうど2レベル下のすべてのディレクトリを検索します。これは、バンドを含むディレクトリです。したがって、2レベル下は、バンド名の下のアルバム名です。1
  • xargs アルバムを含む各パスを消費し、インラインbashスクリプトを呼び出します。
  • bash -c '...'は最初の引数としてアルバムパスを受け取り、そのパスをバンド($b)とアルバム($a)の2つの部分に分割します。最後に、スクリプトは名前を目的の形式に再構成し、新しいディレクトリ名を元のディレクトリにリンクします。

この例では、リンクは、開始したのと同じディレクトリに作成されることに注意してください。これは、バンド名の場所でもあります。

ln上記の戦略を調整して、目的に合わせることができます。mv物理的に再配置したいln場合、またはメディア上で便利な「ビュー」を作成したい場合は、正しいパスを使用します。bashスクリプト内の重要な部分は次のとおりです。

  • $bバンド名。常に引用してください:"$b"
  • $aアルバム名。常に引用してください:"$a"
  • $1アルバムディレクトリへの物理パス。常に引用してください:"$1"

1私はm{ax,in}depth、GNUと一部のBSD findではサポートされていると考えていますが、POSIXではサポートされていません*/*


1
私はこの答えが好きです...ハードリンクを作成し、満足したら古いフォルダー構造を削除することもできます
Thomas Zwaagstra

@ThomasZwaagstraファイルの移動と
同じ

1
@Darkhoggまさに!OPは、ファイルを移動するための1ライナーを探していました。このソリューションでハードリンクを使用すると、ほぼ完了しますが、元のファイルを削除する前に中間の「プレビュー」ステージがありました
Thomas Zwaagstra
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.