"Linha de shell" para remover da pasta atual arquivos que estão duplicados em subpastas
Necessidade: Remover arquivos da pasta atual quando já existe uma cópia idêntica (mesmo nome e mesmo conteúdo) em algum subdiretório.
Solução: Uma daquelas linhas de shell que parecem feitiçaria, mas resolvem o problema. 😄
find . -maxdepth 1 -type f -exec sh -c '
arq="$1"
nome=$(basename "$arq")
find . -mindepth 2 -type f -name "$nome" | while read -r outro; do
cmp -s "$arq" "$outro" && rm "$arq" && break
done
' _ {} \;
Passo a passo:
findexterno percorre apenas o diretório atual (-maxdepth 1) em busca apenas de arquivos (-type f).-exec sh -ccria um pequeno script inline para cada arquivo encontrado.{}é passado como argumento para o shell e recebido em$1.basenameextrai apenas o nome do arquivo.- Um segundo
findprocura arquivos com o mesmo nome em subdiretórios (-mindepth 2). while read -rpercorre os resultados com segurança.cmp -scompara o conteúdo dos arquivos em modo silencioso (o "exit code" indica igualdade).&&encadeia a ação: se os arquivos forem idênticos, executarm.breakinterrompe a busca após encontrar a primeira cópia válida.
#linux #bash #sh #shell #devops