我有一堆文件夹包含有序的图像,但不是这样的顺序:
/root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg
我希望让它们看起来像这样,拥有文件夹标题以及按顺序排列所有图像:
/root /f1 f1_01.jpg f1_02.jpg f1_03.jpg f1_04.jpg /f2 f2_01.jpg f2_02.jpg f2_03.jpg f2_04.jpg
我不确定如何使用shell脚本执行此操作。
提前致谢!
答案 0 :(得分:2)
在目录中,ls
将以词法顺序为您提供文件,从而为您提供正确的排序。所以你可以这样做:
let i=0
ls *.jpg | while read file; do
mv $file prefix_$(printf "%02d" $i).jpg
let i++
done
这将获取所有*.jpg
个文件,并从prefix_00.jpg
,prefix_01.jpg
开始重命名,等等。
这显然只适用于单个目录,但希望通过一些工作,你可以使用它来构建一些能够做你想做的事情。
答案 1 :(得分:2)
使用for
循环迭代目录和另一个for
循环来迭代文件。维护一个计数器,每个文件增加1。
没有直接方便的方法用前导零填充数字。你可以拨打printf
,但这有点慢。一个有用的快速技巧是从101开始计数(如果你想要两位数字 - 如果你想要3位数字则为1000,依此类推)并剥离前导1。
cd /root
for d in */; do
i=100
for f in "$d/"*; do
mv -- "$f" "$d/${d%/}_${i#1}.${f##*.}"
i=$(($i+1))
done
done
${d%/}
在/
末尾$d
剥离${i#1}
,在1
和$i
开头${f##*.}
剥离$f
从.
开始除去最后一个img
之外的所有内容。这些结构在shell手册中有关参数扩展的部分中有说明。
请注意,此脚本假定目标文件名不会与现有文件的名称冲突。如果您有一个名为{{1}}的目录,则会覆盖某些文件。如果这可能是一个问题,最简单的方法是首先将所有文件移动到另一个目录,然后在重命名时将它们移回原始目录。