从枚举文件名中减去数字

时间:2019-01-16 09:26:58

标签: bash file ubuntu

我有一些文件夹,其中包含诸如FILE_001.dat之类的枚举文件。但是,其中一个文件有错误,因此我想从文件夹中删除该文件,然后重命名以下文件,以便我仍将它们按顺序排列,而编号没有任何间隔。有谁知道通过bash做到这一点?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

假设错误的文件是FILE_030.dat,并且您有300个文件。然后,您可以做的是以下

#!/bin/bash
mv FILE_030.dat some_directory/
for ((i=31; i<=300; i++))
do
   filename=FILE_`printf "%03d" ${i}`.dat
   if [ -e ${filename} ]
   then
       newi=$(( $i - 1 ))
       newfilename=FILE_`printf "%03d" ${newi}`.dat
       # This should not happen
       if [ -e ${newfilename} ]
       then
           echo Error moving file ${filename} to ${newfilename}: ${newfilename} exists
           exit
       else
           mv ${filename} ${newfilename}
       fi
   fi
done

如果文件的名称类似于FILE_00030.dat,即5位数字,则必须在上面的代码中将%03d更改为0%5d。 为了安全起见,上面的脚本在已重命名的文件已经存在时会停止。

答案 1 :(得分:1)

在正确设置badfilebad_files_dir之后,尝试以下(Shellcheck干净)代码:

#! /bin/bash

badfile=FILE_013.dat            # The bad file to be moved out
bad_files_dir=../badfilesdir    # The directory to receive the bad file

movedfile=
for file in FILE_[0-9][0-9][0-9].dat ; do
    if [[ -n $movedfile ]] ; then
        mv -- "$file" "$movedfile"
        movedfile=$file
    elif [[ $file == "$badfile" ]] ; then
        mv -- "$file" "$bad_files_dir"
        movedfile=$file
    fi
done