我有一些文件夹,其中包含诸如FILE_001.dat之类的枚举文件。但是,其中一个文件有错误,因此我想从文件夹中删除该文件,然后重命名以下文件,以便我仍将它们按顺序排列,而编号没有任何间隔。有谁知道通过bash做到这一点?
感谢您的帮助
答案 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)
在正确设置badfile
和bad_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