问题描述
我想做的是重命名文件,但前提是这些文件的父目录与给定的模式匹配。
我特别想做的是当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
我做了类似的替换,例如下面的替换,但是它没有考虑到父目录:
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 {} .. \;