次のパターンに従うディレクトリ構造があります。
- 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
、以前にターゲットの親ディレクトリを作成してからファイルを移動する関数として定義しました。