Bash

展平目錄層次結構在新目錄名稱中保留目錄名稱

  • January 3, 2019

我基本上想從這個開始:

.
├── 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如果任何目錄包含隱藏文件名或任何新目錄未能創建,則呼叫將失敗。

這是完全未經測試的程式碼。在文件的備份副本上執行它。

引用自:https://unix.stackexchange.com/questions/492030