elimina ficheiros por iterar um array?

0

Eu tenho dois arrays que possuem números de arquivo e preciso ler esses dois arrays e excluir esses arquivos. Eu preciso ler pri array e excluir arquivos dentro do diretório /primary . Da mesma forma, preciso ler snd array e excluir arquivos dentro do diretório /secondary . Esses dois diretórios têm muitos outros arquivos e outros subdiretórios, então eu preciso ter muito cuidado. Eu só preciso excluir arquivos mencionados apenas nesses dois arrays.

Todos os nomes de arquivos são assim:

abc_monthly_5_log.data
abc_monthly_25_log.data
abc_monthly_78_log.data

Abaixo está meu script e posso iterá-los e excluir esses arquivos um por um. Existe alguma outra maneira melhor pela qual eu possa fazer isso?

# it will lot of file numbers not just four or five files
pri=(0 5 7 100)
snd=(9 8 187 90 156)

# iterate pri array and delete files inside
for pm in "${pri[@]}"; do
    rm /primary/abc_monthly_"$pm"_log.data
done

# iterate snd array and delete files inside
for sm in "${snd[@]}"; do
    rm /secondary/abc_monthly_"$sm"_log.data
done
    
por user1950349 02.05.2018 / 07:16

1 resposta

1

Uma maneira "melhor", que é "melhor" na medida em que executa rm menos frequentemente, seria usar xargs :

{
    for pm in "${pri[@]}"; do
        printf '/primary/abc_monthly_%s_log.data\n' "$pm"
    done

    for sm in "${snd[@]}"; do
        printf '/secondary/abc_monthly_%s_log.data\n' "$sm"
    done
} | xargs rm

Isso usaria os loops apenas como um meio para gerar nomes de caminho. Esses nomes de caminho são então passados para xargs rm , o que executaria rm no maior número possível de uma só vez. Com os arrays de exemplo que você forneceu, provavelmente executaria apenas rm uma vez .

A maneira como escrevi acima supõe que nenhum dos componentes do caminho contém novas linhas literais ou espaços em branco (o que eles não fazem neste exemplo).

    
por 02.05.2018 / 07:47