Command-Line
perl 重命名工具中的 L$2 是什麼意思?
每當有人線上詢問將所有大寫文件重命名為小寫時,我都會看到此命令:
find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
我理解這
find "$(pwd)" -depth -exec rename
部分。有人可以分解並解釋重命名的正則表達式命令 - 即:
's/(.*)\/([^\/]*)/$1\/\L$2/'
- 為什麼
\/([^\/]*)
而不只是(.*)
?- 我知道
$1
bash 的上下文是什麼,但是$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 字母,不適用於實際語言中的其他字元(例如 äöåé)。