Usando o bash, isso removerá todos os arquivos que não tiverem outro arquivo com o mesmo nome, mas extensão diferente:
for f in *; do same=("${f%.*}".*); [ "${#same[@]}" -eq 1 ] && rm "$f"; done
Essa abordagem é segura para todos os nomes de arquivos, mesmo aqueles com espaço em branco em seus nomes.
Como funciona
-
for f in *; do
Isso inicia um loop sobre todos os arquivos no diretório atual.
-
same=("${f%.*}".*)
Isso cria uma matriz bash com os nomes de todos os arquivos com o mesmo nome de base.
$f
é o nome do nosso arquivo.${f%.*}
é o nome do arquivo sem sua extensão. Se, por exemplo, o arquivo forFILE1.doc
,${f%.*}
seráFILE1
."${f%.*}".*
é todos os arquivos com o mesmo nome de base, mas qualquer extensão.("${f%.*}".*)
é uma matriz bash desses nomes.same=("${f%.*}".*)
atribui a matriz à variávelsame
. -
[ "${#same[@]}" -eq 1 ] && rm "$f"
Se houver apenas um arquivo com esse nome de base, o excluiremos.
"${#same[@]}"
é o número de arquivos na matrizsame
.[ "${#same[@]}" -eq 1 ]
é verdadeiro se houver apenas um desses arquivos.&&
é lógico e. Isso faz com que a instrução que segue,rm "$f"
seja executada apenas se a instrução que a precede retornar true lógico. -
done
Isso marca o final do loop
for
.