如何替换文件名和目录名中的哈希模式

菲利普·法纳罗

我刚刚备份了我在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限制。

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

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章