ディレクトリの内容を静的に名前付きサブディレクトリに移動する

ディレクトリの内容を静的に名前付きサブディレクトリに移動する

私のメディアディレクトリ構造は次のとおりです。

~ $ tree baz
baz
├── Ajin [Season 1]
│   ├── Ajin Demi-Human - 01 - A Topic That Has Nothing to Do with Us.mkv
│   ├── Ajin Demi-Human - 02 - Why Is This Happening to Me I Didn`t Do Anything Wrong!.mkv
...snip...
├── Btooom!
│   ├── Btooom! - 01 - Start.mkv
│   ├── Btooom! - 02 - The Bloodstained High School Girl.mkv
...snip...
└── Claymore [Dual Audio]
    ├── checksums.md5
    ├── Claymore - 01 - Great Sword.mkv
    ├── Claymore - 02 - The Black Card.mkv
    ├── Claymore - 03 - The Darkness in Paradise.mkv
...snip...

3 directories, 53 files

ディレクトリを循環し、baz各サブディレクトリに対して「Season 01」というサブサブディレクトリを作成し、すべてのファイル(およびすべてのディレクトリ)を新しく作成したサブサブディレクトリ「Season 01」に入れる必要があります。

たとえば、上記は次のとおりです。

baz
├── Ajin [Season 1]
│   ├── Season 01
│       ├── Ajin Demi-Human - 01 - A Topic That Has Nothing to Do with Us.mkv
│       ├── Ajin Demi-Human - 02 - Why Is This Happening to Me I Didn`t Do Anything Wrong!.mkv
...snip...
etc

これを実行しようとしていますが、find-execコマンドを設定して「Season 01」ディレクトリを作成し、そのディレクトリの内容を新しいディレクトリに移動する方法がわかりません。

ありがとう

答え1

必要なのは単純なループだけです。

cur=$(pwd)
for i in baz/*
do
    cd "$i"
    mkdir season1
    mv *.mkv season1
    cd "$cur"
done

答え2

使用bash:

shopt -s dotglob
for i in baz/*/*; do
  mkdir -p "${i%/*}/Season 01"
  mv "$i" "${i%/*}/Season 01"
done

まず、dotglob隠しファイルの一致も有効にします。その後、bazサブディレクトリのファイルを繰り返します。

  • Season 01ディレクトリがまだ存在しない場合は、ディレクトリが作成されます。パラメータ拡張は${i%/*}ファイル名を削除し、親ディレクトリ(たとえばbaz/Ajin [Season 1])を保持します。
  • 現在のファイルを"$i"シーズンディレクトリに移動します。

関連情報