Você pode fazer isso com find
, mas, para fazê-lo de forma robusta, você precisará incorporar uma linha de uma concha também. A maneira correta de fazer isso é um dos seguintes:
Coloque o loop no shell gerado:
find . -type f -name '._*' -exec sh -c 'for a in "$@"; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf %s\n "$f"; done' find-sh {} +
Ou crie um shell separado para cada arquivo a ser testado (menos eficiente, potencialmente mais legível):
find . -type f -name '._*' -exec sh -c 'f="${1%/*}/${1##*/._}"; [ -e "$f" ] && printf %s\n "$f"' find-sh {} \;
Para remover diretamente os arquivos de backup, altere para o seguinte para execução a seco:
find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +
Em seguida, quando estiver satisfeito com a lista de comandos impressos, use:
find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && rm -- "$a"; done' find-sh {} +
Notas:
Em todos esses, o argumento find-sh
é uma string arbitrária; você poderia colocar qualquer coisa lá. Ele é definido como $0
dentro do shell gerado e é usado para relatório de erros.
for a in "$@"; do
é exatamente equivalente a for a; do
.
printf
é melhor que echo
.