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 IFS
comando.
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 directory
variável e o restante da linha na prefix
variá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 find
busca recursiva, é que $prefix
será usado como se fosse um padrão globbing no find
comando.
Observe que isso *
precisa ser colocado entre aspas quando usado com find
para que o shell não o expanda para nomes correspondentes no diretório atual, e isso *
deve sersem aspasquando usado with rm
no 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 find
restrito 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