'encontra' múltiplas -o-condição de condição AND! -nome

3

Eu estava brincando com esse trecho e parece que não posso fazer o meu desejado find funcionar. Eu tentei google mas todos os tutoriais parece não resolver este cenário

suponha que eu tenha os seguintes arquivos

test-[done].mkv
test.mkv
test2.avi
test3.mp4

o que eu quero é que meu find selecione todos os .mkv OR .avi OR .mp4 , MAS NÃO aqueles com [done] em seu nome

a primeira condição pode ser facilmente resolvida usando

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) -print

mas estou tendo problemas para fazer a segunda condição, tentando

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( ! -name '*[done]*' \) -print

ainda mostra o 'test- [feito] .mkv

test-[done].mkv
test.mkv
test2.avi
test3.mp4

tentando regex porque eu pensei que há um limite para quantos nomes podem ser usados, mas ainda sem sorte

[root@xxxx]# ls
test-[done].mkv  test.mkv  test2.avi  test3.mp4
[root@xxxx]# find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( -regex '.*\(\[done\]\)$' \) -print
test-[done].mkv
test.mkv
test2.avi
test3.mp4

Alguém por favor pode me ajudar a trabalhar nisso? Obrigado!

    
por The Wolf 16.04.2015 / 21:50

1 resposta

5

Para a sua versão -name , em vez de ! -name '*[done]*' você precisa de ! -name '*\[done\]*' - caso contrário, as letras ficam entre colchetes como um conjunto de caracteres, excluindo assim qualquer coisa que inclua a letra "d" ou "o" ou " n "ou" e "(e todos os seus nomes de arquivos contêm" e "). Você estava, então, negando essa condição uma segunda vez, de modo que, em vez de excluir todos os arquivos, ela incluísse todos os arquivos, mas uma versão corrigida seria:

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) \( ! -name '*\[done\]*' \) -print

Sua versão regex está incorreta porque você tem o $ imediatamente após o padrão correspondente a [done] , mas no seu nome real ainda existe uma extensão de arquivo após esse ponto, mas adicionando um .* antes do $ funciona.

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( -regex '.*\(\[done\]\).*$' \) -print
    
por 16.04.2015 / 22:07

Tags