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! (porqueORaplicado 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
*.ogge liste-os (o comando-lsnã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.oggvocê 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.