我提到我已经检查了有关使用bash脚本重命名文件的类似问题,但没有人帮我解决这个问题。
我需要在以下规则之后重命名目录中的许多文件:按字母顺序列出当前文件,然后用给定的基本名称替换它们的名称,添加后缀,即当前文件索引,然后添加给定的扩展名。 / p>
我在索引文件时遇到了问题。例如,如果我有1000个文件,则在执行脚本后,其名称应为file0001.ext, file0002.ext ... file0010.ext ... file0099.ext ... file 0100.ext ... file0999.ext, file1000.ext
。
我已为每个文件计算了所需的零数,但我不知道如何在mv commnad中使用正则表达式实现该规则。以下是我的脚本代码:
#!/bin/bash
nod=0
i=1
nof=$(ls -v $3 | wc -l)
cpy=$nof
while [ $cpy -gt 0]
do
nod=$((nod+1))
cpy=$((cpy/10))
done
for a in $(ls -v $3)
do
cpy_of_i=$i
i_digits=0
while [ $cpy_of_i -gt 0 ]
do
i_digits=$((i_digits+1))
cpy_of_i=$((cpy_of_i/10))
done
nr_zeros=$((nod-i_digits))
old=$3$a
new=$(echo $3$1[0]\*{nr_zeros}$i.$2)
mv $old $new
i=$((i+1))
done
注意:第一个参数是新文件名,第二个参数是新扩展名,第三个参数是包含要重命名的文件的目录。因此,将使用与此类似的命令从命令行调用脚本:./rename.sh new_file pdf /home/dir/something/
答案 0 :(得分:4)
只需在变量中保留一个计数器,在处理完每个文件后使用算术表达式递增它。使用printf
命令替换来创建零填充数字。
new=$1
ext=$2
dir=$3
id=1
for file in "$dir"/* ; do
mv "$file" "$dir/$new"$(printf '%04d' $id)."$ext"
(( id++ ))
done
如果您不想使用不同的扩展程序重命名文件,则可能只需要重命名"$dir"/*."$ext"
。
答案 1 :(得分:0)
这是我的脚本,它仅适用于文件,对它们进行排序并使用正确长度的数字重命名它们(以零开头)
#!/bin/bash
dots=`find -maxdepth 1 -type f |wc -l|sed "s/./\./g"`
zeroes=`find -maxdepth 1 -type f |wc -l|sed "s/./0/g"`
(
echo "x=0;zeroes=${zeroes};"
find -maxdepth 1 -type f |sort |sed 's/.*/echo "mv \0 file${zeroes}$((x++)).txt"/'
)|bash|sed "s/\(file\)0*\(${dots}\.txt\)/\1\2/"
脚本只输入一些mv something file0012.txt
命令,因此您可以将其管道为bash,或将|bash
添加到最后一行的末尾
还要注意,在同一目录上运行这样的脚本次数(经过一些修改 - 可能是你添加了file000000.txt)可能会导致垃圾,因为它会尝试将文件file12.txt移动到file13.txt在途中覆盖其中一些