Bash

find、xargs 和 mv:使用雙引號、擴展和 bash 優先級重命名文件

  • December 9, 2014

好的,我只是想去掉文件名中的雙引號。這是我想出的命令(bash)。

$ find . -iname "*\"*" -print0 | xargs -0 -I {} mv {} {} | tr -d \"

問題是'mv {} {} | tr -d \"'部分。我認為這是一個優先級問題: bash 似乎被解釋為(mv {} {}) | tr -d \"),而我剩下的是兩個文件名都去掉了雙引號。顯然,這不是我想要的,因為它無法重命名文件。相反,我希望第一個文件名帶有引號,而第二個不帶有引號,更像這樣:mv {} ({} | tr -d \").

我該如何做到這一點?我試過括號和花括號,但我不確定在明確設置命令執行優先級時我在做什麼。

假設您已rename安裝命令,請使用:

find . -name '*"*' -exec rename 's/"//g' {} +

rename命令採用一個Perl表達式來生成新名稱。s/"//g執行名稱的全域替換,將所有引號替換為空字元串。

為此,mv您需要通過管道傳輸到 shell 命令,這樣您就可以執行子命令:

find . -name '*"*' -exec sh -c 'mv "$0" "$(printf %s "$0" | tr -d "\"")"' {} \;

您編寫的管道輸出xargsto tr,它不tr用於形成 to 的參數mv

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