0

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

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 这样的继续名称。代码看起来如何?希望你明白这一点。谢谢你的帮助

4

3 回答 3

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选项mv:no clobber(不覆盖已经存在的文件)
  • -v选项:mv冗长(所以你不需要你有的回声)
  • 事情:选项结束,--后面只会找到参数(以防某些文件以连字符开头,这会混淆mv)。
于 2012-12-23T08:26:02.747 回答
-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
于 2012-12-23T03:29:45.143 回答
-1

我理解您的要求的方式是:

将所有 .jpg 文件名从它们所拥有的任何名称更改为 M*.jpg,并在 M 后面添加一个递增数字。

在程序多次运行期间,计数应从上次运行期间设置的 M 文件的最大值开始增加。例如,如果程序的第一次运行创建了 M1、M2、M3,然后您添加了更多文件,它们应该从 M4、M5、M6 开始。

但M1、M2、M3本身不应该改变。

所以有几个建议:

您在脚本开头设置 n=1 。您应该使用上次运行的文件中存在的最大 Mx.jpg 值。

其次,当您在查找文件并对其进行迭代时,请排除所有 M*.jpg 文件,以便它们的名称不会被替换。

你认为这是你的要求。如果您有任何其他输入,请添加评论。将在下一条评论中发送脚本。

测试用例 : Existing Files, 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。

于 2012-12-23T03:19:43.817 回答