更改文件的数字Bash

时间:2018-04-22 17:22:50

标签: linux bash shell rename

我需要实现一个脚本(duplq.sh),它将使用命令行参数重命名当前目录中存在的所有文本文件。因此,如果执行了命令duplq.sh pic 0 3,它将执行以下转换:

pic0.txt必须重命名为pic3.txt

pic1.txtpic4.txt

pic2.txtpic5.txt

pic3.txtpic6.txt

等...

因此,第一个参数始终是文件的名称,第二个参数始终是正数。

我还需要确保在执行脚本时,第一次重命名(pic0.txt到pic3.txt),不会删除当前目录中的现有pic3.txt文件。

这是我到目前为止所做的:

 #!/bin/bash

name="$1"
i="$2"
j="$3"


for file in $name*
do
    echo $file
    find /var/log -name 'name[$i]' | sed -e 's/$i/$j/g'
    i=$(($i+1))
    j=$(($j+1))
done 

但是find命令似乎不起作用。你有其他解决方案吗?

2 个答案:

答案 0 :(得分:0)

可能的解决方案......

#!/bin/sh

NUMBERS=$(ls $1|sed -e 's/pic//g' -e 's/\.txt//g'|sort -n -r)

for N in $NUMBERS
do
    NEW=$(($N + 3))
    echo "pic$N.txt -> pic$NEW.txt"
    mv "pic$N.txt" "pic$NEW.txt"
done

答案 1 :(得分:0)

find个可能的文件,sort按姓名列出的名称,使用sed删除编号低于$1的文件,按编号反转sort,以及从最高编号开始重命名到最低编号:

#!/bin/sh
find . -maxdepth 1 -type f -name "$1"'[0-9]*' | 
sort -g | sed -n "/^$1$2."'/,$p' | sort -gr | 
while read x ; do
    p="${x%%[0-9]*.*}"; s="${x##*[0-9]}" ; i="${x%$s}" i="${i#$p}"
    mv "$x" "$p$((i+$3))$s"
done