Antes de responder à sua pergunta, tenho algumas suposições: Digamos que você tenha um diretório como este
$ ls -1 myMusics
music1
music1.flac
music1.mp3
music2.mp3
music2b.mp3
music3.flac
music4.flac
music4.wav
music5b.flac
music6
music6.mp3
music6.wav
No diretório acima, somente music1.flac
e music4.flac
duplicados serão removidos, porque music2.mp3
, music2b.mp3
, music3.flac
e music5b.flac
não têm duplicatas a serem removidas e, embora music6
tenha duplicados, nenhum deles tem .flac
extensão. Eu também assumi que não há nenhum arquivo como music1.backup.flac
em seu diretório. Se tais arquivos existirem, eles serão tratados como music1.flac
duplicados (se houver).
Com base nas suposições , você pode fazer isso:
$ shopt -s extglob
$ for i in 'ls | egrep .flac$ | sed 's/\.flac$//''; do rm "$i".!(flac);done 2>/dev/null
$ shopt -u extglob
Agora vamos ver o que os comandos acima fazem:
- O segundo item lista todos os arquivos que têm
.flac
extensão no final (ls | egrep .flac$
), - , em seguida, remove o
.flac
do final do nome (| sed 's/\.flac$//
), - em seguida, para cada um dos nomes resultantes de duas etapas anteriores, remove todos os arquivos com esse nome e uma extensão,
- , exceto os que têm
.flac
extensão.rm "$i".!(flac)
remove todos os arquivos que começam com"$i"
e excluem aqueles que têm.flac
extensão. Se você não executarshopt -s extglob
(ou seja, se você não habilitarextglob
), padrões como"$i"!(.flac)
não terão nenhum significado especial e bash procurará pelo nome do arquivo"$i"!(.flac)
exatamente. (o nome"$i"
seguido por!
e, em seguida,(
e assim por diante.) - No final, você pode desativar
extglob
usandoshopt -u extglob
.
Você pode ver o seguinte sobre extglob
in man bash
:
Se a opção de shell extglob estiver ativada usando o shopt builtin , vários operadores de correspondência de padrões são reconhecidos. Na descrição a seguir, uma lista de padrões é uma lista de um ou mais padrões separados por um |. Padrões compostos pode ser formado usando um ou mais dos seguintes sub-padrões:
- ? (pattern-list)
Corresponde a zero ou uma ocorrência dos padrões fornecidos- * (lista de padrões)
Corresponde a zero ou mais ocorrências dos padrões fornecidos- + (lista de padrões)
Corresponde a uma ou mais ocorrências dos padrões fornecidos- @ (lista de padrões)
Corresponde a um dos padrões fornecidos- ! (pattern-list)
Corresponde a qualquer coisa, exceto um dos padrões fornecidos
Além disso, dê uma olhada nessa pergunta: <