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

Dis*_*oat 20 linux bash shell rename file

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

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

是否有一个Linux命令可以整齐地执行此操作?我熟悉重命名,但看不到任何东西来订购这样的文件名.我在想,既然ls *.jpg按顺序列出文件(有间隙),解决办法就是将其输出传递给bash循环或什么?

Mat*_*hen 13

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

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

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                                      
Run Code Online (Sandbox Code Playgroud)

  • 对于其他人的参考,我的最终命令是:i = 0; 用于*.jpg中的文件; 做mv"$ file"$(printf"image_%0.3d.jpg"$ i); I = $(第(i + 1)); DONE (3认同)

Ste*_*202 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
Run Code Online (Sandbox Code Playgroud)

(我添加2>/dev/null || true了禁止有关相同源文件和目标文件的警告.如果这不符合您的喜好,请参阅Matthew Flaschen回答.)