Shell

如何替換文件和目錄名稱中的雜湊模式

  • March 25, 2021

我剛剛備份了我在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}雖然我也無法讓它工作。有沒有辦法讓文件和文件夾都只用一行替換,而不用fors?

我已經在 StackOverflow 上嘗試了許多其他關於此的答案,但到目前為止我發現的幾乎所有答案要麼只處理文件,要麼將固定單詞作為模式。

我想使用 Mass-Move 命令行工具 ( mmv),但是 Arch Linux 沒有官方發行版?

*注意:以下假設您正在使用基於 Perl 的rename命令,正如您觀察到的rename 's/[a-z0-9]{32}//g'“適用於文件”所暗示的那樣。*看


要查找目錄和文件,您需要刪除-type f限制。

此外,您需要防止目錄在包含文件之前被重命名 - 使用 GNUfind可以使用-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:]].

也可以看看:

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