Verifique se há nomes de arquivos relacionados e exclua um deles

2

Eu preciso escrever um script que encontre arquivos que contenham uma string em seu nome. Se houver um arquivo com o mesmo nome, mas sem essa string, desejo remover o arquivo original.

Por exemplo, se eu estiver em um diretório com os seguintes arquivos:

algomb
gomba
alb
algomba
alba

Se a substring for gom , considerarei algomb , gomba e algomba . Removendo gom de cada um desses nomes, eu verificaria a existência de alb , ba e alba . Desses, alb e alba existem, então eu removerei algomb e algomba deixando apenas

alb
alba
gomba

no diretório quando eu terminar.

Aqui está o que eu tentei:

#!/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

Então, isso funciona. Este echo ${talal%%:*}${talal##*:} é retornar o nome do arquivo sem "gom". Mas não posso comparar esses valores com f ind . -type f -exec basename {} \; results.

Dado que posso encontrar os substrings, como posso testar os arquivos e remover os apropriados?

    
por Cafu90 23.09.2015 / 18:00

1 resposta

1

O seguinte deve fazer o que você está perguntando:

#!/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

Algumas notas sobre as alterações e correções:

  • O -printf "%f\n" de Find é preferível a -exec basename {} \; . Neste caso eu removi o find stripping do dirname para que o script seja seguro para estruturas de diretório não-planas.
  • for c in ossz nunca deveria ter funcionado - o nome de barra ossz não é uma variável. $ossz teria sido necessário.
  • O uso de sed é provavelmente preferível a confiar na correspondência e na substituição do padrão bash por motivos de legibilidade.

Exemplo:

Para um diretório contendo os seguintes arquivos:

alb  alba  algomb  algomba  gomb

O script acima gerará o seguinte:

rm -v ./algomb
rm -v ./algomba
    
por 23.09.2015 / 20:37