我有大约36万份文件如下:
./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/' {}/*" \;
我得到了预期的结果:
rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...如果我运行这些重命名命令中的任何一个,就可以重命名。因此,这应该是{}的问题。
谢谢你的帮助!
发布于 2015-01-06 12:09:48
在第一种情况下,*在到达rename之前由shell展开(如果它是展开的--我怀疑有什么与{}/*匹配),如果没有展开,则执行的命令是带有三个参数( -n、s/jpg/jpeg/和some/path/* )的rename。最后一个参数不是现有文件的名称,所以rename什么也不做。
如果没有shell珠化,路径对rename是无用的。
因此,取而代之的是:
find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +使用find的S能力,尽可能用+而不是;构建命令行。
https://unix.stackexchange.com/questions/177705
复制相似问题