我刚刚备份了我在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:]]
.
也可以看看:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句