増加するディレクトリのファイルを1つのディレクトリにマージする方法

増加するディレクトリのファイルを1つのディレクトリにマージする方法

次のパターンに従うディレクトリ構造があります。

- Dir 01 (Disc 1) \
  - Dir 01 (Disc 1).iso
- Dir 01 (Disc 2) \
  - Dir 01 (Disc 2).iso
- Dir 01 (Disc 3) \
  - Dir 01 (Disc 3).iso

- Dir 02 (Disc 1) \
  - Dir 02 (Disc 1).iso
- Dir 02 (Disc 2) \
  - Dir 02 (Disc 2).iso
 
- Dir 02 (Disc 1) (A) \
  - Dir 02 (Disc 1) (A).iso
- Dir 02 (Disc 2) (A) \
  - Dir 02 (Disc 2) (A).iso

私の目標は、次のような構造で終わることです。

- Dir 01 \
  - Dir 01 (Disc 1).iso
  - Dir 01 (Disc 2).iso
  - Dir 01 (Disc 3).iso

- Dir 02 \
  - Dir 02 (Disc 1).iso
  - Dir 02 (Disc 2).iso

- Dir 02 (A) \
  - Dir 02 (Disc 1) (A).iso
  - Dir 02 (Disc 2) (A).iso

これらのディレクトリを繰り返し、ファイル名を一致させ、すべてを適切な場所に移動する方法が必要であることを知っていますが、スクリプトを作成する方法はわかりません。どんなアドバイスも本当にありがとうございます。

答え1

必要なツリー構造を指定したことを考慮してこれに固執します。しかし、ディレクトリとファイル名のいずれにせよ、スペースを避けることが重要であることは、いくら強調しても過度ではありません。スペースを必要とせずにその場で "_"を使用することができる場合は、私たちに知らせれば更新されたツリー構造を提供します。

初期ツリー:

tree
.
├── Dir 01 (Disc 1)
│   └── Dir 01 (Disc 1).iso
├── Dir 01 (Disc 2)
│   └── Dir 01 (Disc 2).iso
├── Dir 01 (Disc 3)
│   └── Dir 01 (Disc 3).iso
├── Dir 02 (Disc 1)
│   └── Dir 02 (Disc 1).iso
├── Dir 02 (Disc 1) (A)
│   └── Dir 02 (Disc 1) (A).iso
├── Dir 02 (Disc 2)
│   └── Dir 02 (Disc 2).iso
└── Dir 02 (Disc 2) (A)
    └── Dir 02 (Disc 2) (A).iso

8 directories, 7 files

コマンドで再構成 - コメントを残すことはできますが、必ずコマンドにコピーして貼り付けてください。


find . -type f -iname '*iso' -exec bash -c '
    var="$1" ;                                                   # found filename variable
    bad_dir=$(dirname "$var" | grep -i "disc");                  # old directory name variable
    good_dir=$(echo "$bad_dir" | cut -d" " -f1,2,5- ) ;          # Only acts on dirnames with "disc"
     
    if [[ -n $good_dir ]] ; then                           
       mkdir -p "$good_dir" ;                                    # creates new proper dir  
       mv "$var" "$good_dir" ;                                   # mv file to new dir
       rmdir "$bad_dir"                                          # removes old bad dir
    fi 
' bash {} \;                 

新しいディレクトリツリー構造をテストします。

tree .
.
├── Dir 01
│   ├── Dir 01 (Disc 1).iso
│   ├── Dir 01 (Disc 2).iso
│   └── Dir 01 (Disc 3).iso
├── Dir 02
│   ├── Dir 02 (Disc 1).iso
│   └── Dir 02 (Disc 2).iso
└── Dir 02 (A)
    ├── Dir 02 (Disc 1) (A).iso
    └── Dir 02 (Disc 2) (A).iso

4 directories, 7 files

ノート: コマンドを再実行しても、現在の構造が破壊されないことを確認するチェックを追加しました。また、上記は、次のように、より複雑なファイル名とディレクトリ名にも適用されます。

├── Dir 01 (Disc 3) (A) (B) (C)
    └── Dir 01 (Disc 3) (A) (B) (C).iso
├── Dir 02 (Disc 1) (A) (B)
    └── Dir 02 (Disc 1) (A) (B).iso

次のように再構成されます。

├── Dir 01 (A) (B) (C)
│   └── Dir 01 (Disc 3) (A) (B) (C).iso
└── Dir 02 (A) (B)
    └── Dir 02 (Disc 1) (A) (B).iso

答え2

そしてzsh

autoload -U zmv
mkmv() { mkdir -p -- $2:h && mv -- "$@"; }
zmv -P mkmv -n '(*) [(]Disc <->[)](*)/(*.iso)' '$1$2/$3'

-n何が起こっているのかを示すために練習を実行する場所)

これは以下を提供します:

mkmv 'Dir 01 (Disc 1)/Dir 01 (Disc 1).iso' 'Dir 01/Dir 01 (Disc 1).iso'
mkmv 'Dir 01 (Disc 2)/Dir 01 (Disc 2).iso' 'Dir 01/Dir 01 (Disc 2).iso'
mkmv 'Dir 01 (Disc 3)/Dir 01 (Disc 3).iso' 'Dir 01/Dir 01 (Disc 3).iso'
mkmv 'Dir 02 (Disc 1) (A)/Dir 02 (Disc 1) (A).iso' 'Dir 02 (A)/Dir 02 (Disc 1) (A).iso'
mkmv 'Dir 02 (Disc 1)/Dir 02 (Disc 1).iso' 'Dir 02/Dir 02 (Disc 1).iso'
mkmv 'Dir 02 (Disc 2) (A)/Dir 02 (Disc 2) (A).iso' 'Dir 02 (A)/Dir 02 (Disc 2) (A).iso'
mkmv 'Dir 02 (Disc 2)/Dir 02 (Disc 2).iso' 'Dir 02/Dir 02 (Disc 2).iso'

ここではmkmv、以前にターゲットの親ディレクトリを作成してからファイルを移動する関数として定義しました。

関連情報