我在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可以帮帮我吗?
最好的问候,理查德
答案 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功能:
以下是一个例子:
#!/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