Como procurar por um arquivo por padrão de nome e executar um comando em seu diretório?

0

O que o comando a seguir deve fazer é procurar todos os arquivos PDF da fatura e verificar se existe um arquivo de miniatura dentro do mesmo diretório. Caso contrário, deverá imprimir o diretório. Mais tarde, adicionarei um comando que criará as miniaturas.

find . -maxdepth 2 -type f -name "invoice_*.pdf" -exec sh -c '[ -f "$(dirname {})/thumbnail.jpeg" ] || echo {}' ';'

O comando está funcionando, mas além do caminho eu vejo o seguinte

sh: 1: Syntax error: "(" unexpected (expecting ")")

Eu acho que o caminho do arquivo é interpretado como comando.

    
por Aley 15.02.2018 / 05:55

1 resposta

3

Você tem um ( em um dos nomes de seus arquivos e não está citando.

Tente:

find . -mindepth 3 -maxdepth 3 -type f -exec sh -c '[ -f "$(dirname '"'{}'"')/thumbnail.jpeg" ] || echo "{}"' \;

A cotação em andamento com '"'{}'"' é passar aspas duplas até o comando dirname, caso haja um ( no nome do arquivo. O comando '[ -f .. ]' também precisa de aspas duplas e o comando echo também precisa de citações!

Pode ser mais fácil usar find para chamar um script e passar o caminho como um argumento para que você não precise pensar em várias camadas de cotação e substituição. Por exemplo (não testado):

$ cat script
#!/bin/bash --
dir=$(dirname "${1}")
[ -f "${dir}/thumbnail.jpeg" ] || echo "${1}" 

$ find . -mindepth 3 -maxdepth 3 -type f -exec ./script '{}' \;
    
por 15.02.2018 / 11:27

Tags