Shell脚本重命名

时间:2012-12-23 03:01:48

标签: linux shell file-rename batch-rename

现在我有这样的重命名脚本:

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。代码怎么样?希望你能理解。谢谢你的帮助

3 个答案:

答案 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