Comando Find não excluindo nada quando -delete é usado

2

Estou usando este script:

find $convfold -name \*.mkv -o -name \*.avi -o -name \*.mov -o -name \*.wmv -o -name \*.m4p -o -name \*.m4v -o -name \*.mpg -o -name \*.mp2 -o -name \*.mpeg -o -name \*.mpe -o -name \*.mpv -o -name \*.m2v -o -name *.m4v -delete

onde $convfold é uma variável para a pasta em que estou excluindo o vídeo.

Se eu remover o -delete do código, ele exibirá os arquivos que ele deve excluir, mas quando eu o tiver no código, não receberei erros de retorno nem exceções.

Exemplo:

flynn@Tron:~/FilebotHandbrake/testconverting$ find -name \*.mkv -o -name \*.mp4 -o -name \*.avi 
./TV Shows/Mr. Robot/Season 02/Mr. Robot - S02E02 - eps2.0_unm4sk-pt2.tc.mkv
./TV Shows/Mr. Robot/Season 02/Mr. Robot - S02E01 - eps2.0_unm4sk-pt1.tc.mkv

Qualquer ajuda ou sugestão seria apreciada.

    
por TheSpawnMan 30.08.2016 / 22:33

1 resposta

2

A questão é que, com find , lógico e vincula-se mais strong que o lógico-or. Observe:

$ ls
file1  file2  file3  file4
$ find . -name \*1 -o -name \*2 -exec echo {} \;
./file2

Acima, -name \*2 e -exec echo {} \; estão vinculados a um lógico-e implícito. Isso é lógico e vincula mais strong que o lógico, ou -o , que conecta o primeiro -name ao segundo.

Para evitar isso, você precisa aplicar parênteses para agrupamento:

$ find . \( -name \*1 -o -name \*2 \) -exec echo {} \;
./file1
./file2

Ou, para o seu comando completo:

find $convfold \( -name \*.mkv -o -name \*.avi -o -name \*.mov -o -name \*.wmv -o -name \*.m4p -o -name \*.m4v -o -name \*.mpg -o -name \*.mp2 -o -name \*.mpeg -o -name \*.mpe -o -name \*.mpv -o -name \*.m2v -o -name *.m4v \) -delete

Documentação

De man find :

Please note that -a when specified implicitly (for example by two tests appearing without an explicit operator between them) or explicitly has higher precedence than -o. This means that find . -name afile -o -name bfile -print will never print afile.

    
por 30.08.2016 / 22:44