Linux文件名检查是否存在和删除

时间:2015-09-23 15:35:55

标签: linux shell sh

我在Shell脚本中遇到了一些问题。 所以我必须编写一个脚本,用这个字符串查找目录中的每个文件:“gom”。所以我发现了所有这些。在我需要切断它之后,比较剩下的文件名是否存在。如果存在,我需要删除包含该字符串的文件。

示例:有5个文件:algomb,gomba,alb,algomba,alba。

我需要找到带有“gom”的文件名。 algomb,gomba,algomba。 之后,我需要削减“gom”。剩下的文件名存在我需要用“gom”字符串删除文件。 所以切割“gom”后会有5个文件:alb,ba,alb,alba,alba 所以有两个文件是extist:alb,alba ....我需要删除以下文件:algomb,albomba。 之后会有3个文件:gomba,alb,alba。

抱歉我的英语不好。

我可以找到,我可以删除,但我无法比较文件名。

这是我的代码:

#!/bin/bash 
sz="gom"
talal=`find . -type f -name "*$sz*" -exec basename {} \;`
ossz=`find . -type f -exec basename {} \;`
c=`echo ${talal%%:*}${talal##*:}`

for c in ossz; do       
if [ ! -d ]; then
    echo "This is a directory"  
else    
if [ -f ];
then
    find .-type f -name "*$sz*" -exec basename {} \;  
else    
    echo ${talal%%:*}${talal##*:} 

fi  
fi
done

所以这是有效的。这个echo ${talal%%:*}${talal##*:}会返回没有“gom”的文件名。但我无法将这些值与find . -type f -exec basename {} \;结果进行比较。

抱歉我的英语不好。 sombody可以帮帮我吗?

最好的问候,理查德

2 个答案:

答案 0 :(得分:0)

我会这样做,没有find

shopt -s globstar
for gom_file in **/*gom*; do
    # Skip non-regular files
    [[ -f $gom_file ]] || continue
    # Delete the file if the gom-free file exists
    [[ -f ${gom_file/$sz//} ]] && rm "$gom_file"
done

使用find效率稍差,因为您需要为每个文件分叉一个新shell:

find . -type f -name "*gom*" -exec bash -c 'echo rm -f "${1/gom/}"' {} \;

运行此选项以测试它是否输出您要执行的rm命令,然后在删除echo的情况下再次运行它。

答案 1 :(得分:0)

我认为您想要使用这些bash功能:

  • array(declare -a)
  • 哈希表(声明-A)
  • 正则表达式($ {a / b / c} $ {a // b / c})

以下是一个例子:

#!/bin/bash 
sz="gom"

declare -a ta
declare -A ossz

i=0

while read -r -d $'\0' ff
do ta[$i]=$ff
   i=$((i+1))
done < <(find . -type f -name "*$sz*" -print0)

while read -r -d $'\0' ff
do ossz[${ff##*/}]=1
done < <(find . -type f -print0)

for ff in "${ta[@]}"
do subff=${ff/$sz/}
   subff=${subff##*/}
   if [ _${ossz[$subff]} = _1 ]
   then echo "$ff"
   fi
done