检查相关文件名并删除其中一个

检查相关文件名并删除其中一个

我需要编写一个脚本来查找名称中包含字符串的文件。如果存在同名但没有该字符串的文件,我想删除原始文件。

例如,如果我位于包含以下文件的目录中:

algomb
gomba
alb
algomba
alba

如果子字符串是gom那么我会考虑algomb, gomba, 和algombagom从每个名称中删除后,我将检查albba和是否存在alba。其中,alb确实alba存在,所以我会删除algombalgomba留下

alb
alba
gomba

当我完成后在目录中。

这是我尝试过的:

#!/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 {} \;结果进行比较。

鉴于我可以找到子字符串,我如何测试文件并删除适当的文件?

答案1

以下内容应该满足您的要求:

#!/bin/bash
sz="gom"
dir="/where/the/files/are"

find $dir -type f -name "*${sz}*" -print0 | while read -d '' -r c; do
    if [[ -f "$(echo $c | sed 's/'"${sz}"'//g')" ]]; then
        # Strip the 'echo' to have this actually do things
        echo rm -v "$c"
    fi
done

有关更改和修复的一些说明:

  • Find-printf "%f\n"优于-exec basename {} \;.在这种情况下,我删除了 find 剥离目录名,以便脚本对于非平面目录结构是安全的。
  • for c in ossz不应该起作用 - 裸名ossz不是变量。$ossz会需要的。
  • 出于可读性原因,使用sed可能比依赖 bash 模式匹配和替换更可取。

例子:

对于包含以下文件的目录:

alb  alba  algomb  algomba  gomb

上面的脚本将输出以下内容:

rm -v ./algomb
rm -v ./algomba

相关内容