Shell
如何替換文件和目錄名稱中的雜湊模式
我剛剛備份了我在Notion中的筆記,它們在筆記名稱中使用雜湊碼以使它們明顯獨一無二。
例如,這可能是一個帶有一些註釋的註釋文件夾:
Archive e74f698cb73b42c790d08999bdbe47e4 ├── Note 1 cda63bef095a493f9847d516cf34fa5f.md ├── Note 2 dda63bef095a493f9847d516cf34fa5f.md
(有時還有一個
.csv
表格文件)我試圖使用正則表達式
[a-z0-9]{32}
來替換模式,但很難讓它與s/
:find -type f -print0 | xargs -0 rename 's/[a-z0-9]{32}//g'
(我不確定我是否真的理解目的
-print0
和目的-0
是什麼。)上面的程式碼只適用於文件,但我也嘗試過使用類似的東西,
mv $f ${f:0:-34}
雖然我也無法讓它工作。有沒有辦法讓文件和文件夾都只用一行替換,而不用for
s?我已經在 StackOverflow 上嘗試了許多其他關於此的答案,但到目前為止我發現的幾乎所有答案要麼只處理文件,要麼將固定單詞作為模式。
我想使用 Mass-Move 命令行工具 (
mmv
),但是 Arch Linux 沒有官方發行版?
*注意:以下假設您正在使用基於 Perl 的
rename
命令,正如您觀察到的rename 's/[a-z0-9]{32}//g'
“適用於文件”所暗示的那樣。*看要查找目錄和文件,您需要刪除
-type f
限制。此外,您需要防止目錄在包含文件之前被重命名 - 使用 GNU
find
可以使用-depth
指定深度優先遍歷來完成。最後,您需要確保該
rename
命令僅對文件基本名稱而不是其路徑組件進行操作 - 您的rename
實現可能會提供一個選項來執行此操作(例如-d
,--filename
,--nopath
,--nofullpath
),但您也可以通過使用該操作rename
直接呼叫。find``-execdir
所以
find . -depth -execdir rename -n 's/ [a-z0-9]{32}//' {} +
-n
(一旦您對提議的替換感到滿意,請刪除)。請注意,您不需要g
替換標誌來替換每個文件的模式的單個實例。您也可以考慮替換
[a-z0-9]
為[[:xdigit:]]
.也可以看看: