以下两个脚本分别在ksh和bash上实现删除一系列文件。在语法和shell工具上有一定区别:
ksh下实现:
#################################################################################
# Developed by Jacking to delete the same tpye files in sequence #
# example: #
# del_seq_file.sh S009505.LOG S0096911.LOG #
# #
# then the logs from S009505.LOG to S0096911.LOG will be deleted. #
#################################################################################
#!/usr/bin/ksh
if [ $# -ne 2 ]
then
echo "Usage:"
echo "\t$0 file1 file2"
echo "the file1 and file2 should be the same in suffix."
exit 1
fi
BEGIN_FILE=$1
END_FILE=$2
SUFFIX1=${BEGIN_FILE##*.}
#echo $SUFFIX1
SUFFIX2=${END_FILE##*.}
#echo $SUFFIX2
if [ $SUFFIX1 != $SUFFIX2 ]
then
echo "Error: $BEGIN_FILE is not the same type as $END_FILE."
exit 2
fi
len=${#BEGIN_FILE}
i=$len
#ksh don't use for((i=$len;i>0;i--))
while [[ $i -ge 0 ]]
do
sub_str=$(echo "$BEGIN_FILE" | cut -c1-$i)
if echo "$END_FILE" | grep -qF "$sub_str"
then
MAX_STR=$(echo "$BEGIN_FILE" | cut -c1-$i) #${BEGIN_FILE:0:$i}
#echo "max str is '$MAX_STR'"
break
fi
(( i-=1 ))
done
BEGIN_NUM=${BEGIN_FILE#$MAX_STR}
#echo $BEGIN_NUM;
BEGIN_NUM=${BEGIN_NUM%.$SUFFIX1}
#echo $BEGIN_NUM;
if echo "$BEGIN_NUM" | egrep -q '^([0-9])+$'
then
:
else
echo "Sequence: $BEGIN_FILE ~ $END_FILE. Error begin with $BEGIN_FILE."
exit 3
fi
END_NUM=${END_FILE#$MAX_STR}
END_NUM=${END_NUM%.$SUFFIX1}
if echo "$END_NUM" | egrep -q '^([0-9])+$'
then
:
else
echo "Sequence: $BEGIN_FILE ~ $END_FILE. Error end with $END_FILE."
exit 3
fi
RM_NUM=0
LEN=${#END_NUM}
RM_FILE=""
i=$BEGIN_NUM
#for ((i=$BEGIN_NUM; i<=$END_NUM; i++))
while [[ $i -le $END_NUM ]]
do
#RM_FILE="$MAX_STR""$i"".$SUFFIX1"
RM_FILE=$(printf "${MAX_STR}%0${LEN}d.$SUFFIX1" $i)
if [ -e $RM_FILE ]
then
#echo "delete $RM_FILE"" yes"
rm -f $RM_FILE
RM_NUM=$((RM_NUM+1))
else
#echo "delete $RM_FILE"" no"
:
fi
(( i+=1 ))
done
echo "\ndelete $RM_NUM files."
bash下实现:
#################################################################################
# Developed by Jacking to delete the same tpye files in sequence #
# example: #
# del_seq_file.sh S009505.LOG S0096911.LOG #
# #
# then the logs from S009505.LOG to S0096911.LOG will be deleted. #
#################################################################################
#!/bin/sh
if [ $# -ne 2 ]
then
echo "Usage:"
echo -e "\t$0 file1 file2"
echo "the file1 and file2 should be the same in suffix."
exit 1
fi
BEGIN_FILE=$1
END_FILE=$2
SUFFIX1=${BEGIN_FILE##*.}
#echo $SUFFIX1
SUFFIX2=${END_FILE##*.}
#echo $SUFFIX2
if [ $SUFFIX1 != $SUFFIX2 ]
then
echo "Error: $BEGIN_FILE is not the same type as $END_FILE."
exit 2
fi
len=${#BEGIN_FILE}
for((i=$len;i>0;i--))
do
if echo "$END_FILE" | grep -qF "${BEGIN_FILE:0:$i}"
then
MAX_STR=${BEGIN_FILE:0:$i}
#echo "max str is '$MAX_STR'"
break
fi
done
BEGIN_NUM=${BEGIN_FILE#$MAX_STR}
#echo $BEGIN_NUM;
BEGIN_NUM=${BEGIN_NUM%.$SUFFIX1}
#echo $BEGIN_NUM;
if echo "$BEGIN_NUM" | grep -q '^[0-9]\+$'
then
:
else
echo "Sequence: $BEGIN_FILE ~ $END_FILE. Error begin with $BEGIN_FILE."
exit 3
fi
END_NUM=${END_FILE#$MAX_STR}
END_NUM=${END_NUM%.$SUFFIX1}
if echo "$END_NUM" | grep -q '^[0-9]\+$'
then
:
else
echo "Sequence: $BEGIN_FILE ~ $END_FILE. Error end with $END_FILE."
exit 3
fi
RM_NUM=0
LEN=${#END_NUM}
RM_FILE=""
for ((i=$BEGIN_NUM; i<=$END_NUM; i++))
do
#RM_FILE="$MAX_STR""$i"".$SUFFIX1"
RM_FILE=$(printf "${MAX_STR}%0${LEN}d.$SUFFIX1" $i)
if [ -e $RM_FILE ]
then
#echo "delete $RM_FILE"" yes"
rm -f $RM_FILE
RM_NUM=$((RM_NUM+1))
else
#echo "delete $RM_FILE"" no"
:
fi
done
echo -e "\ndelete $RM_NUM files."