I have renamed many files by using ‘rename
‘.
However, I find a problem with conversion dates to numbers.
The file name is 2021.0801, 2021.0802, .. etc. (Year.Month&date)
I need to change Month&date parts to numbers of 001, 002, etc.
So I need to rename
2021.0801 2021.0802 ... 2021.0929 2021.0930
to
2021.001 2021.002 ... 2021.0** 2021.0**
I saw I can do it when I use rename or #, ? but I could not see the specific way to solve this.
Could you please let me know the way to rename these?
p.s. I tried num=001; for i in {0801..0930}; do rename $i $num *; (($num++)); done
but it showed
2021.001 2021.001001 2021.001001001001 ...
Additionally, ls 2021.*
shows only the files that I want to change.
Advertisement
Answer
Your script contains a few errors. I suggest to use https://www.shellcheck.net/ to check your scripts.
After fixing the errors, the (unfinished) result is
#!/bin/bash num=001; for i in {0801..0930}; do rename "$i" "$num" ./*; ((num++)); done
This has 3 remaining problems.
- The range
{0801..0930}
includes the numbers0831
,0832
, …0899
,0900
. This can be fixed by using two ranges{0801..0831} {0901..0930}
- The increment operation
((num++))
does not preserve the leading zeros. This can be fixed by conditionally adding 1 or 2 zeros. - You call
rename
for every combination which will check all files and probably rename only one. As you know the exact file names you can replace this with amv
command.
The final version is
num=1; for i in {0801..0831} {0901..0930}; do if [[ num -lt 10 ]] ; then new="00$num"; elif [[ num -lt 100 ]] ; then new="0$num"; else new="$num"; # this case is not necessary here fi; mv "2021.$i" "2021.$new"; ((num++)); done
The script handles leading zeros for values of 1, 2 or 3 digits which is not needed here as all numbers are less than 100. For this case, it can be simplified as
num=1; for i in {0801..0831} {0901..0930}; do if [[ num -lt 10 ]] ; then new="00$num"; else new="0$num"; fi; mv "2021.$i" "2021.$new"; ((num++)); done
The script will execute these commands:
mv 2021.0801 2021.001 mv 2021.0802 2021.002 ... mv 2021.0830 2021.030 mv 2021.0831 2021.031 mv 2021.0901 2021.032 mv 2021.0902 2021.033 ... mv 2021.0929 2021.060 mv 2021.0930 2021.061