awk和sed用于重命名文件中带有索引的部分。

huangapple go评论60阅读模式
英文:

awk sed rename files with indexation in them

问题

我有一个文件夹里有多个文件,它们的命名遵循以下顺序:

im.0001.jpeg
im.0006.jpeg
im.0011.jpeg
im.0016.jpeg

你想要将它们重命名成以下顺序:

im.0001.jpeg
im.0002.jpeg
im.0003.jpeg
im.0004.jpeg

附注:目前数字之间的索引变化是5,但这个值可能会有所不同。

英文:

I have multiple files in a folder named by following a sequence such as :

im.0001.jpeg
im.0006.jpeg
im.0011.jpeg
im.0016.jpeg

etc

how can I rename them in order to have this :

im.0001.jpeg
im.0002.jpeg
im.0003.jpeg
im.0004.jpeg

etc

ps: currently the indexation change between numbers is 5 but this could vary

答案1

得分: 3

使用 Perl 的 rename 来进行重命名:

$ rename -n 's/\d+/sprintf "%.4d", ++$main::c/e' ./im*.jpeg
rename(./im.0006.jpeg, ./im.0002.jpeg)
rename(./im.0011.jpeg, ./im.0003.jpeg)
rename(./im.0016.jpeg, ./im.0004.jpeg)

当你满意于重命名结果,移除 -n 开关,即实际重命名而非仅测试。

没有 im.0001.jpeg 因为它已经存在。

英文:

Like this, using Perl's rename:

$ rename -n 's/\d+/sprintf "%.4d", ++$main::c/e' ./im*.jpeg
rename(./im.0006.jpeg, ./im.0002.jpeg)
rename(./im.0011.jpeg, ./im.0003.jpeg)
rename(./im.0016.jpeg, ./im.0004.jpeg)

Remove -n switch, aka dry-run when your attempts are satisfactory to rename for real.

There's no im.0001.jpeg because it already exists.

答案2

得分: 0

以下是已翻译的内容:

尝试使用此循环:

#!/bin/bash

files=$(printf '%s\n' im.*.jpeg)

index=1

for file in $files
do
  mv "$file" "im.$(printf '%04d' $index).jpeg"
  index=$((index+1))
done
英文:

Try with this loop:

#!/bin/bash

files=$(printf '%s\n' im.*.jpeg)

index=1

for file in $files
do
  mv "$file" "im.$(printf '%04d' $index).jpeg"
  index=$((index+1))
done

答案3

得分: 0

你要求sed/awk,所以可能不想要循环等等... 尝试这个:

printf "%s\n"|awk -F . '{ if ($2==NR) next;printf "mv %s im.%4.4i.jpeg\n",$0,NR}'|sh

请注意检查源文件名和目标文件名是否相等,因为它目前依赖于当前编号周围的点。

如果可能的错误(当当前编号可能已经适用于第一行时)不会干扰您的私人和平,您可以消除 if ($2==NR) next; 并且可以省略错误输出(通过追加 &2>&-&2>/dev/null)。

英文:

you asked for sed/awk, so propably doesn't want loops etc. ... try this:

printf "%s\n" *|awk -F . '{ if ($2==NR) next;printf "mv %s im.%4.4i.jpeg\n",$0,NR}'|sh

careful with the checking for equal source and destination name, as it currently relies upon the dots surrounding current numbering.

If possible errors (when current numbering may already fit for the first lines) doesn't disturb your private peace, you can eliminate if ($2==NR) next; and evtl. drop error output (by appending &2>- or &2>/dev/null)

huangapple
  • 本文由 发表于 2023年4月6日 22:40:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/75950811.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定