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

问题描述

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

我特别想做的是当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 {} .. \;