Estou ciente de que posso usar awk
para analisar vários delims, mas isso gera subprocessos. Eu queria saber se a expansão do parâmetro bash composto/aninhado é possível.
Eu tenho PDFs em um diretório chamado "Px_MM-DD-YY_SSSSSSSSSS.pdf" onde:
- "Px" significa "Página x" e x não tem zeros à esquerda.
- "MM" corresponde ao mês de dois dígitos, com um zero à esquerda, se aplicável.
- "DD" corresponde ao dia de dois dígitos, com um zero à esquerda, se aplicável.
- "YY" corresponde ao ano de dois dígitos, com um zero à esquerda, se aplicável.
- "SSSSSSSSSS" corresponde à época de dez dígitos em que o PDF foi criado, o que me permite manter as revisões da página do PDF.
Eu tenho um loop for (vou soltar "-mtime" quando estiver pronto para operar em todos os PDFs)
for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
echo $file
done
onde eu quero ecoar apenas o tempo da época.
Eu posso usar isso para loop
for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
echo ${file##*_}
done
e para o arquivo chamado como "./P14_07-21-18_4X_1532144458.pdf", "1532144458.pdf" é exibido na tela.
Eu posso usar isso para loop
for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
echo ${file%.*}
done
e para o arquivo chamado "./P14_07-21-18_4X_1532144458.pdf", "./P14_07-21-18_4X_1532144458" é exibido na tela.
Se eu substituir a echo ...
linha por qualquer um dos formatos abaixo
echo ${${file##*_}:0:10}
echo ${(${file##*_}):0:10}
echo ${${file##*_}%.*}
echo ${{file%.*}##_}
echo ${${file%.*}##_}
eu consigo -bash: ... : bad substitution
. Não estou obtendo a sintaxe correta ou a expansão do bash aninhado/composto não é possível?
Você não pode realizar a substituição aninhada com a variável na parte mais à esquerda . Então você pode fazer
${foo#$bar}
, mas não o que você mostra.Coloque o resultado da substituição em uma variável se quiser usá-lo em outras substituições.
Você não pode fazer uma substituição de parâmetro agir no resultado de outra substituição de parâmetro sem primeiro salvar o resultado inicial em uma variável e aplicar a segunda substituição a ela.
Você também faz um loop na saída de
find
, o 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á:Dessa forma, você não precisa se preocupar com quais são os nomes de caminho 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\0
, por exemplo, espaço e nova linha. Ao usar uma substituição de comando emfind
, 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 executar a geração de nome de arquivo em padrões encontrados nos nomes de caminho retornados defind
. Seu loop original pode, portanto, acabar repetindo palavras bem diferentes do que você esperaria.Relacionado:
Se bem entendi, o problema de usar o Awk é que você está invocando um processo Awk para cada arquivo PDF (presumo que você tenha um grande número deles).
Você poderia executar algo ao longo das linhas de
Ou se você mantém sua estrutura:
(e, claro, substitua o comando Perl por qualquer equivalente Awk, sed, Python)
(Se você tiver a oportunidade de tentar esta abordagem, diga-nos o
time ....
obtido)