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

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

我刚刚备份了我的笔记概念,并且他们在笔记名称中使用哈希码来使它们明显地独一无二。

例如,这可能是一个带有一些注释的注释文件夹:

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 的官方发行版?

答案1

注意:下面假设您正在使用基于 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:]].

也可以看看:

相关内容