避免Linux bash脚本在重新运行时重复文件重命名

nfs0ujit  于 2023-05-22  发布在  Linux
关注(0)|答案(1)|浏览(193)

在我的Linux系统中,我有从data 001到data 100的100个目录,我希望我的bash脚本根据目录名用不同的扩展名重命名所有数据文件。例如,data 001目录中的文件应重命名为 *001.txt和 *001.nc,data 002目录中的文件应重命名为 *002.txt和 *002.nc,依此类推。我有一个bash脚本来完成这项工作,但是当我尝试重新运行该脚本时,它重复了名称,例如data 001- *001001.txt *001_001.nc。我想确保如果我重新运行脚本,它的代码不会影响命名格式。

#!/bin/bash
for ((ii=1; ii<=100; ii++))
do
    dirname=$(printf "data%03d" $ii)
    for file in $dirname/*
    do
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename_without_ext="${filename%.*}"
        newname=$(printf "%s_%03d.%s" "$filename_without_ext" $ii "$extension")
        
        # Skip if the file is already in the desired format
        if [[ "$filename_without_ext" != *"_${ii}" ]]; then
            mv "$file" "$dirname/$newname"
        fi
    done
done
px9o7tmv

px9o7tmv1#

*"_${ii}"的字符串插值不会以您期望的方式生成后缀。

> ii=3
> echo "_${ii}"
_3

但我想您希望_003用于格式比较。
我建议您事先准备好预期格式的suffix,然后在整个脚本中使用它。

#!/bin/bash
for ((ii=1; ii<=100; ii++))
do
    dirname=$(printf "data%03d" $ii)
    for file in $dirname/*
    do
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename_without_ext="${filename%.*}"
        suffix=$(printf "_%03d" $ii)
        newname=$(printf "%s%s.%s" "$filename_without_ext" "$suffix" "$extension")

        # Skip if the file is already in the desired format
        if [[ "$filename_without_ext" != *"$suffix" ]]; then
            mv "$file" "$dirname/$newname"
        fi
    done
done

相关问题