Estou fazendo algumas coisas com arquivos de áudio, a maioria, mas não todos, são arquivos mp3. Agora eu quero executar alguns comandos apenas nos arquivos que não são arquivos mp3, ou apenas naqueles que não possuem .mp3
extensão.
Eu me considero muito bom em expressões regulares, mas não tanto em globbing de arquivos, que é sutilmente diferente de maneiras inesperadas.
Olhei em volta e aprendi com outras respostas SO & SE que Bash tem "globbing estendido" que me permite fazer isso:
file ../foo/bar/*.!(mp3)
Mas alguns dos meus nomes de arquivo têm pontos além do que forma a extensão do nome do arquivo:
../foo/bar/Naked_Scientists_Show_19.10.15.mp3
../foo/bar/YWCS_ep504-111519-pt1_5ej4_41cc9320.mp3_42827d48daefaa81ec09202e67fa8461_24419113.mp3
../foo/bar/eLife_Podcast_19.09.26.mp3
../foo/bar/gdn.sci.080428.bg.science_weekly.mp3
Parece que o glob combina do primeiro ponto em diante, e não do último ponto. Eu olhei para a documentação, mas parece que eles são muito menos poderosos que os regexes. Mas eu realmente não groguei tudo, pois não gasto muito tempo em *nix shells.
Eu perdi alguma maneira de ainda poder fazer isso com o Bash globbing? Se não, uma maneira de conseguir a mesma coisa com find ou alguma outra ferramenta ainda valeria a pena conhecer.
*.!(mp3)
correspondefoo.bar.mp3
porque éfoo.
seguido porbar.mp3
que nãomp3
é .Você quer
!(*.mp3)
aqui, que corresponde a qualquer coisa que não termine em.mp3
.Se você deseja corresponder arquivos cujo nome contém pelo menos um
.
(diferente de um inicial que os tornaria um arquivo oculto), mas não termina em.mp3
, você pode fazer!(*.mp3|!(*.*))
.Há também a
GLOBIGNORE
variável :a maneira mais simples que consigo pensar:
Você encontra todos os arquivos em uma pasta e os canaliza para um grep estendido reverso:
Encontre todos os arquivos em um local
Reverse grep e use um regex para filtrar por extensão
Sinalizadores de Grep:
-v
grep reverso-E
grep estendido (uso de regex)Regex explicou:
.*
significa de 0 a qualquer contagem de caracteres, qualquer caractere possível\.
procura o ponto realmp3
para a string que forma a extensão$
significa EOLPossivelmente não é o ideal para sua situação, mas eu queria saber que tal fazer uma função em puro
Bash
e depois passar a extensão como um arg, o que pode ser útil se você quiser adicioná-lo no seubashrc
e quiser fazer a mesma coisa no futuro, como o seguinteEntão, basicamente o que estamos fazendo é a verificação de regex para a extensão desejada.
Implementando-o em uma função: Isso produziria todos os arquivos com extensão específica em seu diretório atual.
Agora, por exemplo, para obter todos os arquivos com
mp3
extensão, seria tão simples quanto fazer:E para obter arquivos sem extensão específica: Isso produziria todos os arquivos que não possuem extensão específica em seu diretório atual.
Da mesma forma, para obter arquivos sem
mp3
extensão, basta fazer:Para mais informações:
https://stackoverflow.com/questions/407184/how-to-check-the-extension-of-a-filename-in-a-bash-script
https://stackoverflow.com/questions/18278990/easiest-way-to-check-for-file-extension-in-bash/18280350