Existe uma armadilha com as palavras-chave e / ou em find
. or
aplicado a todos os parâmetros a seguir, incluindo a ação ( -ls
em seu exemplo). As expressões and
sem or
(ou anexadas com and
) são avaliadas na ordem de leitura com uma parada final como falsa. Não há implicit ()
.
Então o comando find POD -type f -name *.mp3 -or -name *.ogg -ls
significa,
- pesquisa (iniciando no diretório POD) para arquivos --- se nenhum arquivo foi encontrado: STOP
- else (arquivo encontrado) padrão de verificação que corresponde a
*.mp3
--- se combinar com o padrão: PARE! (porqueOR
aplicado aqui e somente se o comando anterior falhou (mas apenas o comando anterior, não os grupos de comando anteriores)
e porque você adiciona uma instrução de execução ( -ls
, -exec
, -print
....) na linha de comando, não há comando -print
implícito e, portanto, nada a ser executado se 1) todas as condições de 1) são verdadeiras (arquivo e padrão combinados). Se você remover o último -ls
, haverá um implícito -print
distribuído no final de cada condição.
- else se o padrão não corresponder à pesquisa por nada (arquivo / diretório) que corresponda ao padrão
*.ogg
e liste-os (o comando-ls
não é uma condição, será executado apenas se o comando / teste anterior "pattern*.ogg
é true) .Mas por causa de 1), 2) é avaliado apenas para arquivos MP3 NÃO Se você não tem arquivos.ogg
você não vê nada.
Solução 1 repita o comando de execução em cada ramificação lógica
find POD -type f -name "*.mp3" -ls -or -name "*.ogg" -ls
Solução 2 adicionar parêntesis (protegidos por shell)
find POD -type f \( -name "*.mp3" -ls -or -name "*.ogg" \) -ls
Nota você deve proteger os padrões para evitar a avaliação do padrão do shell no diretório atual.