Bash
展平目錄層次結構在新目錄名稱中保留目錄名稱
我基本上想從這個開始:
. ├── 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 做到這一點真是太好了,但我不知道該怎麼做。
Zsh
未經測試:
zmv -Q '(*)/(*)(/)' '$1 - $2' rmdir -- *(/^F)
第二行刪除所有空目錄,甚至那些之前沒有文件的目錄。可以使用自定義包裝器來解決此問題,該
mv
包裝器記錄它從哪些目錄中移動內容。請注意,這會遍歷指向目前目錄中目錄的符號連結。
Linux 重命名實用程序
未經測試。
rename / ' - ' */*/ rmdir -- */ 2>/dev/null
請注意,這會遍歷指向目前目錄及其子目錄中目錄的符號連結。第二行刪除所有空目錄,甚至那些之前沒有文件的目錄。
Perl 重命名腳本
未經測試。
prename 's~/~ - ~' */*/ rmdir -- */ 2>/dev/null
請注意,這會遍歷指向目前目錄及其子目錄中目錄的符號連結。第二行刪除所有空目錄,甚至那些之前沒有文件的目錄。
這是一種更複雜的方法,它只刪除它重命名的目錄。再次,未經測試。
prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/
可能是這樣的?
#!/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
如果任何目錄包含隱藏文件名或任何新目錄未能創建,則呼叫將失敗。這是完全未經測試的程式碼。在文件的備份副本上執行它。