Command-Line

perl 重命名工具中的 L$2 是什麼意思?

  • July 11, 2020

每當有人線上詢問將所有大寫文件重命名為小寫時,我都會看到此命令:

find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

我理解這find "$(pwd)" -depth -exec rename部分。

有人可以分解並解釋重命名的正則表達式命令 - 即:'s/(.*)\/([^\/]*)/$1\/\L$2/'

  • 為什麼\/([^\/]*)而不只是(.*)
  • 我知道$1bash 的上下文是什麼,但是$1,是什麼\L$2意思rename
  • 我也很欣賞這與簡單的有什麼不同
find "$(pwd)" -depth -exec rename 'y/A-Z/a-z/' {} \;
  • 最後,你會推薦什麼書或資源來學習這種東西?我閱讀了rename手冊頁;但是,我沒有找到關於這種用法的解釋。

第一個s/,最後一個/和中間的未轉義/是替換運算符和分隔符,所以我們有模式(.*)\/([^\/]*)和替換$1\/\L$2

(.*)\/([^\/]*)第一個(.*)\/匹配到最後一個斜杠的所有內容,即最終文件名之前的路徑。最後一個([^\/]*)然後匹配任何內容,但斜線到字元串的末尾。

在替換中,$1放回括號中第一個擷取組匹配的內容,即路徑。然後\L將以下部分、第二個擷取的 group$2或文件名小寫。

這裡的最終結果是小寫僅適用於最終文件名部分,因此例如dir/OTHERDIR/FOO.txt變為dir/OTHERDIR/foo.txt,而不是dir/otherdir/foo.txt。直接重命名為後者是行不通的,因為dir/otherdir可能不存在。


但是……我認為你可以執行:

find . -depth -execdir rename 'y/A-Z/a-z/' {} +

"$(pwd)"(或更簡單地說,"$PWD")僅用於find生成絕對路徑,而不是相對路徑,但沒有必要這樣做。-execdir在每個目錄中單獨執行rename,而不是全部在主級別中執行,從而擺脫了處理完整路徑的問題。而{} +不是{} \;讓我們find為每次重命名呼叫提供多個文件。

儘管請注意,所有這些可能僅適用於 26 個 ASCII 字母,不適用於實際語言中的其他字元(例如 äöåé)。

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