3

我正在尝试获取文件列表并重命名它们,在它们的文件名中增加一个数字。该目录包含一堆文件,名称如下:

senreg1.csv      senreg2.csv              senreg10.csv
senreg1.csv.1    senreg2.csv.1            senreg10.csv.1
senreg1.csv.2    senreg2.csv.2            senreg10.csv.2
senreg1.csv.3    senreg2.csv.3      ...   senreg10.csv.3
senreg1.csv.4    senreg2.csv.4            senreg10.csv.4
...              ...                      ...
senreg1.csv.10   senreg2.csv.10           senreg10.csv.10
senreg1.csv.11   senreg2.csv.11           senreg10.csv.11

我想增加所有以 3 或更高结尾的文件,这样我就可以插入一个后缀为 3 的新文件,所以我创建了一个名为“renames.txt”的文本文件,其中包含我想要重命名的所有文件名。然后,我尝试使用 for 循环来进行实际的重命名。

for f in `cat renames.txt`
do
    newfile=`echo $f | awk 'BEGIN { FS = "."}; { printf $1 "." $2 "." $3+1 }'`
    mv "$f" "$newfile"
done

我想最终得到类似的东西:

senreg1.csv      senreg2.csv              senreg10.csv
senreg1.csv.1    senreg2.csv.1            senreg10.csv.1
senreg1.csv.2    senreg2.csv.2            senreg10.csv.2
senreg1.csv.4    senreg2.csv.4      ...   senreg10.csv.4
senreg1.csv.5    senreg2.csv.5            senreg10.csv.5
...              ...                      ...
senreg1.csv.11   senreg2.csv.11           senreg10.csv.11
senreg1.csv.12   senreg2.csv.12           senreg10.csv.12

但相反,我得到:

senreg1.csv      senreg2.csv              senreg10.csv
senreg1.csv.1    senreg2.csv.1            senreg10.csv.1
senreg1.csv.2    senreg2.csv.2     ...    senreg10.csv.2
senreg1.csv.12   senreg2.csv.12           senreg10.csv.12

senregX.csv.12 的内容与原始的 senregX.csv.3 相同。希望这个解释是有道理的。有人知道这里发生了什么吗?

4

2 回答 2

1

您需要反向重命名文件。

11 -> 12
10 -> 11
9 -> 10

等等。

于 2013-01-16T03:22:55.560 回答
0

这个脚本做你想做的事,没有临时文件,只是为了有多种解决方案:

#!/bin/bash
for file in $(ls -1 *[0-9]) # list files ending with a number
do 
  # get file name and id
  name=$(echo $file | sed 's/\(.*\)\.\([0-9]\+\)$/\1/g');
  id=$(echo $file | sed 's/.*\.\([0-9]\+\)$/\1/g');

  if [ $id -ge 3 ]
  then
    ((id += 1))

    # We need to backup the files because we may override some files
    cp  $file  "_$name.$id"
  fi
done


# remove old files
for file in $(ls -1 [!_]*[0-9])
do 
  id=$(echo $file | sed 's/.*\.\([0-9]\+\)$/\1/g');

  if [ $id -ge 3 ]
  then
    rm $file;
  fi
done


# finish
for file in $(ls -1 _*[0-9])
do 
  name=$(echo $file | tr -d '_');
  mv "$file" "$name";
done
于 2013-01-16T04:00:36.177 回答