英文:
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
)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论