Bash

為什麼這個使用正則表達式的 Bash 命令沒有替換我的括號?

  • September 27, 2015

我有這個命令來遍歷我的Music目錄中的所有文件和所有子目錄,並用圓括號替換文件名中的任何方括號:

find /home/Music/ -depth -name "* *" -execdir rename 's/\[/\(/g' "{}" \;

但它不起作用。它不會返回任何錯誤,只是不會進行替換。

我以為我正確地逃脫了角色。我哪裡錯了?

此外,最終我想用圓括號 , 替換大括號 , {}()只是想我現在要提一下,以防大括號帶來更多的複雜性。

我能明白為什麼它不起作用的唯一原因是如果沒有文件名中包含空格。僅當文件名有空格時,模式"* *"才會匹配。

如果要查找名稱包含方括號的文件,請執行

find /home/Music/ -depth -name "*[*" -execdir rename 's/\[/\(/g' "{}" \;

Linux 上有兩個主要的rename實現:

  • 隨附的perl(可能是您所期望的)
  • util-linux 附帶的一個(可能是您擁有的那個)。

附帶的語法util-linux是:

find ... -execdir rename '[' '(' {} +

但是,這只會替換[.

perl``rename可能會在您的prename系統上呼叫。

renamezsh 的替代方案是zmv. 它將首先處理降序目錄深度並避免衝突問題。

在 zsh 中:

autoload zmv
zmv '(**/)(* *)' '$1${2//\[/(}'

{}並將兩者轉換[]()

zmv -n '(**/)(* *)' '$1${${2//[]\}]/)}//[[{]/(}'    

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