Linux使用bash脚本重命名多个文件+添加后缀

时间:2016-01-15 12:16:04

标签: regex linux bash

我提到我已经检查了有关使用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/

2 个答案:

答案 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在途中覆盖其中一些