Bash

如何重命名多個目錄?

  • September 14, 2021

這是我的目錄:

P [001]
P [002]
P [003]

我想重命名為:

P001
P002
P003

我使用了程式碼:

for P in *\ *; do mv '$P' '${P// /_}'; done

但我錯過了一些東西。

嘗試prename

$ ls
P [001]  P [002]  P [003]
$ prename 's/[ \[\]]//g' P\ *
$ ls
P001  P002  P003
$

'或者,堅持使用您原來的腳本方法(對to稍作調整併對"正則表達式稍作更改)

$ ls
P [001]  P [002]  P [003]
$ for P in *\ *; do mv "$P" "${P//[\[\] ]/}" ; done
$ ls
P001  P002  P003
$

請注意目錄是否在彼此內部,換句話說,如果您以遞歸方式執行此操作,則上述答案均無效(也許prename有效,我不確定)。例如:

P [1]
  |___P [10]
  |___P [11]
        |___P [112]
        |___other
              |___P [113]
P [21]
P [132]

您可以在不安裝任何軟體包的情況下使用它:

find . -type d -name 'P [*' -printf "echo mv \'%h/%f\' \'%h/\$(echo %f | sed \"s/[][ ]//g\")\'\n" | sort -r | sh

用於測試和做實際工作:

find . -type d -name 'P [*' -printf "mv \'%h/%f\' \'%h/\$(echo %f | sed "s/[][ ]//g\")\'" | sort -r | sh

說明:查看目前文件夾 ( find .) 並找到-type d名稱匹配 ( ) 的所有目錄 ( - name 'P [*') 並列印將傳遞給sh執行的命令。printf用找到的文件的路徑和名稱替換 %h 和 %f。該部分$(echo %f | sed 's/[][ ]//g')要求sed命令將所有文件名 ( ) 中的( s/) 括號和空格 ( [ ][ ] )替換為空 ( )。重要的是在執行這些命令()之前對它們進行反向排序( ),否則您可能在重命名父文件夾之前重命名它的子文件夾並且命令失敗。//``g``| sort -r``| sh

希望它是有用的。

編輯:由於@AdminBee,修復了名稱中的空格問題

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