Bash: Script de shell exclui arquivos correspondentes a todos os argumentos passados?

1

Esta é uma questão de atribuição, por isso não estou procurando diretamente por uma resposta ou pelo script. Então, em uma das minhas perguntas, me pediram que eu excluísse os arquivos contendo qualquer dos argumentos passados da linha de comando. Aqui está o trecho de script para isso

#!/bin/sh

#some more stuff here

for args in "$@"; do
    if  [ $#  != 0 ]; then
        grep -l $args * | while read theFile; 
        do
            if [ -f "$theFile" ] ; then
                rm "$theFile"
                echo "$theFile is deleted with $args match"
            else
                echo "$theFile not deleted"
                exit 2
            fi
        done #end of while loop
    else 
        echo "No match found with $args"
        exit 1
    fi
    done
echo "DONE"
exit 0 

Agora, eu gostaria de saber como eu escreveria o script para que ele apagasse os arquivos que têm ALL os argumentos ? Eu entendo que eu preciso verificar se cada arquivo tem os argumentos passados com um loop for, mas não tenho certeza de como eu estaria escrevendo. Qualquer entrada será apreciada.

Estou usando o cloud9 para praticar, se essa informação for necessária.

    
por MeOw 02.03.2018 / 19:55

1 resposta

1

Agora você está dando um loop pelas palavras-chave ( for arg in.. ) e, em seguida, para cada palavra-chave, verificando quais arquivos contêm essa palavra-chave ( grep -l $arg * ).

Para verificar se há arquivos com todas as palavras-chave que você poderia inverter e executar o loop em todos os arquivos ( for f in * ), execute loop pelas palavras-chave ( for arg in "$@" ), verificando se o arquivo as contém ( grep -qe "$arg" "$f" ) somente removendo se todos eles corresponderem.

Isso é uma força bruta, já que você executaria grep n * m vezes, para arquivos n e < em> m palavras-chave. A alternativa seria executar grep -l para a primeira palavra-chave e, em seguida, grep -l para a segunda palavra-chave, dando grep à lista de arquivos retornados pelo último grep etc. Você provavelmente desejaria salvar a lista de arquivos em uma matriz em cada etapa.

Como observação, isso não faz sentido:

for args in "$@"; do
    if  [ $#  != 0 ];

Você está verificando os argumentos numéricos dentro de um loop que é executado uma vez para cada argumento. $# é zero exatamente quando não há argumentos, mas "$@" também não contém nada e o loop não será executado.

Aqui:

grep -l $args * | while read theFile; 

Você provavelmente deve citar $args e talvez queira dar uma olhada em BashFAQ 001 para obter informações sobre usando while read ...

Em suma, você provavelmente quer

grep -l "$args" * | while IFS= read -r theFile; do
    
por 02.03.2018 / 20:18