我正在尝试获取文件列表并重命名它们,在文件名中增加一个数字。该目录包含一堆名为:
的文件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相同。希望这个解释有意义。有谁知道这里发生了什么?
答案 0 :(得分: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
答案 1 :(得分:-1)
您需要反向重命名文件。
11 -> 12
10 -> 11
9 -> 10
等等。
答案 2 :(得分:-1)
在安装{em> 后,使用here中的.sh脚本(有关安装方法,请参见 help ),您应该可以使用:< / p>
renn ".csv.@" ".csv.[i+1]" "{i -ge 3}" '<dir_path>'
要了解如何使用脚本,可以使用--help
标志对其进行调用。