在Linux上将一组文件重命名为001,002,....

时间:2009-05-19 00:38:29

标签: linux bash shell file rename

我最初有一组image_001.jpg,image_002.jpg,...形式的图像。

我经历了他们并删除了几个。现在我想将剩余的文件重命名为image_001.jpg,image_002.jpg,...

是否有一个Linux命令能够巧妙地完成这项工作?我熟悉重命名,但看不到任何东西来订购这样的文件名。我在想,因为ls *.jpg按顺序列出文件(有间隙),解决办法是将其输出传递给bash循环还是什么?

6 个答案:

答案 0 :(得分:13)

如果我理解正确,你可以image_001.jpg,image_003.jpg,image_005.jpg,你想重命名为image_001.jpg,image_002.jpg,image_003.jpg。

编辑:修改此项以将临时文件放在当前目录中。正如Stephan202所指出的,如果temp在不同的文件系统上,这可能会产生显着的差异。为了避免在循环中访问临时文件,它现在通过image *

i=1; temp=$(mktemp -p .); for file in image*
do
mv "$file" $temp;
mv $temp $(printf "image_%0.3d.jpg" $i)
i=$((i + 1))
done                                      

答案 1 :(得分:9)

一个简单的循环(使用echo进行测试,使用mv执行):

I=1
for F in *; do
  echo "$F" `printf image_%03d.jpg $I`
  #mv "$F" `printf image_%03d.jpg $I` 2>/dev/null || true
  I=$((I + 1))
done

(我添加2>/dev/null || true来取消有关相同源文件和目标文件的警告。如果这不符合您的喜好,请使用Matthew Flaschenanswer。)

答案 2 :(得分:2)

尝试以下脚本:

numerate.sh

此代码段应该可以胜任:

./numerate.sh -d <your image folder> -b <start number> -L 3 -p image_ -s .jpg -o numerically -r

答案 3 :(得分:1)

这与您要求的相反(获取* .jpg.001形式的文件并将其转换为* .001.jpg),但可以根据您的目的轻松修改:

for file in * 

do

if [[ "$file" =~ "(.*)\.([[:alpha:]]+)\.([[:digit:]]{3,})$" ]]

then

mv "${BASH_REMATCH[0]}" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}.${BASH_REMATCH[2]}"

fi

done

答案 4 :(得分:1)

这里有一些好的答案;但有些人依赖于隐藏错误,这不是一个好主意(假设mv只会因为预期的条件而出错 - 那么所有其他的mv可能会出错?)。

此外,它可以做得更短,应该更好地引用:

for file in *; do
    printf -vsequenceImage 'image_%03d.jpg' "$((++i))"
    [[ -e $sequenceImage ]] || \
        mv "$file" "$sequenceImage"
done

另请注意bash脚本中的you shouldn't capitalize your variables

答案 5 :(得分:0)

我将使用for循环,迭代器,cut -f1 -d“_”,然后使用mv i i.iterator建议类似上面的内容。看起来它已经涵盖了其他方式。