首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用find -exec重命名360个文件

使用find -exec重命名360个文件
EN

Unix & Linux用户
提问于 2015-01-06 11:21:54
回答 1查看 8.4K关注 0票数 3

我有大约36万份文件如下:

代码语言:javascript
复制
./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

我希望使用rename重命名文件,例如,从*.jpg重命名为*.jpeg。我不能用单个rename来实现,因为我得到的错误参数列表太长了。

为了寻找解决方案,我想出了这个办法,但它没有任何改名:

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

当我检查是否展开{}时,用echo替换重命名:

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

我得到了预期的结果:

代码语言:javascript
复制
rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

如果我运行这些重命名命令中的任何一个,就可以重命名。因此,这应该是{}的问题。

谢谢你的帮助!

EN

回答 1

Unix & Linux用户

发布于 2015-01-06 12:09:48

在第一种情况下,*在到达rename之前由shell展开(如果它是展开的--我怀疑有什么与{}/*匹配),如果没有展开,则执行的命令是带有三个参数( -ns/jpg/jpeg/some/path/* )的rename。最后一个参数不是现有文件的名称,所以rename什么也不做。

如果没有shell珠化,路径对rename是无用的。

因此,取而代之的是:

代码语言:javascript
复制
find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

使用find的S能力,尽可能用+而不是;构建命令行。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/177705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档