微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在目录和文件名中查找模式并仅在为父目录找到模式时才对文件执行重命名?

如何解决如何在目录和文件名中查找模式并仅在为父目录找到模式时才对文件执行重命名?

我想做的是重命名文件,但前提是这些文件的父目录与给定的模式匹配。

我特别想做的是当partent 目录是cd1 或cd2 时,然后在文件名的开头插入1_ 或2_。

例如我有

./Documentary/Arctic/cd1/01 - Penguin
./Documentary/Arctic/cd1/02 - Polarbear
./Documentary/Arctic/cd2/01 - Whale
./Documentary/Arctic/cd2/02 - Walrus
./Documentary/Jungle/01 - Tiger
./Documentary/Jungle/02 - Monkey

我想把它改成这样:

./Documentary/Arctic/cd1/1_01 - Penguin
./Documentary/Arctic/cd1/1_02 - Polarbear
./Documentary/Arctic/cd2/2_01 - Whale
./Documentary/Arctic/cd2/2_02 - Walrus
./Documentary/Jungle/01 - Tiger
./Documentary/Jungle/02 - Monkey

我做了类似的替换,例如下面的替换,但是它没有考虑到父目录:

将“1 - 10 集名称重命名为“1_10 集名称”:

find . -type f -name '[[:digit:]] - [[:digit:]][[:digit:]] *' -execdir prename -n 's/(.*\/\d) - (\d\d .*)/$1_$2/' {} +

更新:在这方面取得了一些进展。我现在可以使用“全名”选项找到文件,我现在正在尝试计算重命名部分。

find . -depth -wholename '*/cd[[:digit:]]*/[[:digit:]][[:digit:]]*'

解决方法

想通了,耶!这对我来说很难,但我正在慢慢学习。

find . -depth -type f -iwholename '*/cd[[:digit:]]*/[[:digit:]][[:digit:]]*' -exec prename -n 's/(.*\/[cC][dD])(\d)(.*\/)(\d\d .*)/$1$2$3$2_$4/g' {} +

此外,如果您想将重命名的文件上移一个级别:

find . -depth -type f -iwholename '*/cd[[:digit:]]*/[[:digit:]]_[[:digit:]][[:digit:]]*' -execdir mv {} .. \;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。