Você não pode ter uma substituição de parâmetro agindo sobre o resultado de outra substituição de parâmetro sem primeiro salvar o resultado inicial em uma variável e aplicando a segunda substituição a ele.
Você também faz um loop pela saída de find
, que não é recomendado .
A maneira correta de fornecer um loop com o resultado de find
é chamar um shell filho e fazer o loop lá:
find . -type f -iname '*_??????????.pdf' -mtime -1 -exec sh -c '
for pathname do
timestamp=${pathname##*_} # remove up to last _
timestamp=${timestamp%.pdf} # remove .pdf
printf "pathname=%s\ttimestamp=%s\n" "$pathname" "$timestamp"
done' sh {} +
Dessa forma, você não precisa se preocupar com os nomes dos caminhos reais. Nomes de arquivos (ou seja, nomes de arquivos e diretórios e outros tipos de arquivos) no Unix podem conter qualquer caractere diferente de /
e find
, por exemplo, espaço e nova linha. Usando uma substituição de comando em find
, você força o shell a primeiro fazer a divisão de palavras (por padrão em espaços, tabulações e novas linhas) e em segundo lugar a geração de nome de arquivo nos padrões encontrados nos nomes de caminho retornados de %code% . Seu loop original pode, portanto, acabar dando um loop em palavras bem diferentes do que você esperaria.
Relacionados: