现在我有这样的重命名脚本:
cd /Users/KanZ/Desktop/Project/Test/
n=1
for file in *.jpg; do
echo $file
prefix=M
file_name=M$n.jpg
echo $file_name
n=$(( $n+1 ))
mv $file $file_name
done
第一个如果我运行脚本,所有jpg文件将是M1.jpg M2.jpg M3.jpg但如果我将新文件名A1.jpg添加到此目录并再次运行脚本。所有M1.jpg M2.jpg M3.jpg将被M4.jpg取代(在运行脚本之前,这个文件名为A1.jpg)因为第一个字母是A.它来自M.这是我的问题。我想获得M1 M2 M3 M4.jpg并且每次有新文件到来时,这个脚本将生成继续名称,如M5.jpg M6.jpg。代码怎么样?希望你能理解。谢谢你的帮助
答案 0 :(得分:0)
到目前为止给出的其他答案并未向您展示任何良好做法。
这是一种可能性,假设编号是连续的(即,没有从M4.jpg
跳转到M6.jpg
)。没有这个假设,脚本是安全的(它不会覆盖现有文件,但不会重命名某些文件)。
#!/bin/bash
shopt -s extglob
shopt -s nullglob
cd /Users/KanZ/Desktop/Project/Test/
# Determine how many files MX.jpg you have (with X a number):
files=( M+([[:digit:]]).jpg )
n=${#files[@]}
for file in !(M+([[:digit:]])).jpg; do
file_name=M$((++n)).jpg
mv -vn -- "$file" "$file_name"
done
-n
的{{1}}选项:no clobber(不覆盖现有文件)mv
的{{1}}选项:详细(因此您不需要您拥有的回声)-v
事情:选项结束时,只会在后面找到参数(以防某些文件以连字符开头,这会混淆mv
)。答案 1 :(得分:-1)
我理解你的要求的方式是:
将所有.jpg文件名从其所有名称更改为M * .jpg,并使用M后面的增量编号。
在程序的多次运行期间,计数应该从上次运行期间设置的M文件的最高值增加。例如,如果程序的第一次运行创建了M1,M2,M3,然后你添加了更多的文件,它们应该从M4,M5,M6开始。
但M1,M2,M3本身不应该改变。
所以有几点建议:
您在脚本开头设置n = 1。您应该使用上一次运行文件中存在的Mx.jpg的最高值。
其次,当您查找文件并对其进行迭代时,请排除所有M * .jpg文件,以便不替换它们的名称。
您认为这是您的要求吗?如果您有任何其他输入,请添加评论。将在下一条评论中发送脚本。
测试案例: 现有文件,X.jpg,ASG.jpg,GER.jpg 运行后的文件名:M1.jpg,M2.jpg,M3.jpg
如果您在第一次运行后再次运行该脚本而没有其他文件:文件名不应有任何更改:M1.jpg,M2.jpg,M3.jpg。
现在添加更多文件:Z.jpg,A.jpg,B.jpg 文件名应更改如下:
M1.jpg => M1.jpg,M2.jpg => M2.jpg,M3.jpg => M3.jpg,A.jpg => M4.jpg,B.jpg => M5.jpg,Z.jpg => M6.jpg。 因此文件名将是M1.jpg,M2.jpg,M3.jpg,M4.jpg,M5.jpg,M6jpg。
答案 2 :(得分:-1)
这个小脚本会做到这一点。
cd /Users/KanZ/Desktop/Project/Test/
n=$(ls -1 | grep '^M' -c) # find the number for M files
ls -1 *.jpg| grep -v '^M' | while read file # for each of the non-M files
do
n=$(($n+1));
new_file=M$n.jpg # new name with next available M file name
mv "$file" "$new_file" # rename with new file name
done
了解它的工作原理。
test/rename$ for x in 1 2 3; do echo A$x> A$x.jpg; done;
test/rename$ ls
A1.jpg A2.jpg A3.jpg
test/rename$ cat ../rnm.sh
#!/bin/bash
cd "$1"
n=$(ls -1 | grep '^M' -c)
nfiles=$(ls -1 *.jpg| grep -v '^M');
for file in $nfiles;
do
n=$(($n+1));
new_file=M$n.jpg
mv $file $new_file
done
test/rename$ bash ../rnm.sh ./
test/rename$ ls
M1.jpg M2.jpg M3.jpg
test/rename$ for x in 1 2 ; do echo B$x> B$x.jpg; done;
test/rename$ ls
B1.jpg B2.jpg M1.jpg M2.jpg M3.jpg
test/rename$ bash ../rnm.sh ./
test/rename$ ls
M1.jpg M2.jpg M3.jpg M4.jpg M5.jpg
test/rename$ for x in *.jpg; do echo $x; cat $x; done;
M1.jpg
A1
M2.jpg
A2
M3.jpg
A3
M4.jpg
B1
M5.jpg
B2