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 *; doIsso 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. -
doneIsso marca o final do loop
for.