Como ler tokens de um arquivo de entrada para excluir arquivos mencionados lá

Como ler tokens de um arquivo de entrada para excluir arquivos mencionados lá

Estou criando um script que exclui arquivos usando a configuração que contém Pasta e File_Prefix.

  • Este será o arquivo de configuração: config.txt

    /local/FolderA,App
    /local/FolderB,Log
    /local/FolderC,File
    
  • Este é o meu roteiro:

    file="local/config.txt"
    while IFS="," read -r folder prefix;
    do
        find %s -name %s* -type f -exec rm {} \ "$folder" "$prefix";
    done < "$file"
    

No entanto, não está funcionando corretamente. Você pode ajudar na solução de problemas? Estou tendo problemas para atribuir os valores do IFScomando.

Responder1

Supondo que seu arquivo de configuração não contenha campos com novas linhas ou vírgulas incorporadas e supondo que você deseja excluir todos os arquivos que possuem o prefixo de nome de arquivo mencionado apenas nos diretórios designados (ou seja, não recursivamente):

#!/bin/sh

while IFS=, read -r directory prefix; do
    rm -- "$directory/$prefix"*
done <config.txt

Isso lê o primeiro campo delimitado por vírgula em cada linha na directoryvariável e o restante da linha na prefixvariável. Em seguida, ele os usa para excluir os arquivos. (VerOnde está documentado o argumento `--` (traço duplo)?para uma explicação sobre --)

Se você precisar fazer a exclusão recursivamente, abaixo de cada caminho de diretório mencionado:

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt

A diferença entre os dois, além da findbusca recursiva, é que $prefixserá usado como se fosse um padrão globbing no findcomando.

Observe que isso *precisa ser colocado entre aspas quando usado com findpara que o shell não o expanda para nomes correspondentes no diretório atual, e isso *deve sersem aspasquando usado with rmno primeiro loop acima, para que o shell o expanda para todos os nomes correspondentes.

Se vocênãodeseja fazer a exclusão recursivamente, mas você tem tantos arquivos que correspondem aos padrões gerados que o primeiro loop fornece um erro de "lista de argumentos muito longa", então você pode querer fazer um loop interno extra,

#!/bin/sh

while IFS=, read -r directory prefix; do
    for pathname in "$directory/$prefix"*; do
        rm -- "$pathname"
    done
done <config.txt

ou use findrestrito ao caminho de pesquisa de nível superior,

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt

Responder2

Usamos xargs para passar caminhos de arquivos do arquivo config.txt para um executável sh em sua linha de comando.

< config.txt xargs -rd'\n' sh -c '
for arg do
 find "${arg%,*}" \
    -name "${arg##*,}*" \
    -type f \
    -exec rm -f {} + ;
done
' xargs-sh

informação relacionada