Ok, eu tenho muitos arquivos em uma pasta que possuem a string " $varname .txt"` em seus nomes:
for file in find output/ -name "*$varname*.txt" -type f; do echo $file; done
...
agora, todos esses arquivos têm duas linhas e 9 colunas. Quero adicionar o conteúdo da linha 2, col 9 ao final do nome do arquivo (logo antes do .txt
).
Então eu sei como imprimir o valor na célula (2, 9) de todos esses arquivos:
find output/ -name "*$varname*.txt" -type f -exec awk -F' ' 'NR==2{print $9}' {} \;
O que eu luto é como colocar essa string como a última coisa antes da extensão nesses nomes de arquivo
Você precisa capturar o valor e construir o novo nome de arquivo com ele.
Estou chamando um shell script na
-exec
diretiva, passando vários nomes de arquivos para ele (com-exec ... +
em vez de-exec ... \;
)O "sh" à direita se torna $ 0 e os nomes dos arquivos vão para $ 1, $ 2 etc.
Aqui está uma abordagem GNU
parallel
:Isso canaliza a lista de arquivos delimitados por zero para a
parallel
qual lista os comandos de renomeação - removaecho
se fizer a coisa certa.parallel
vem com strings de substituição úteis,{}
é substituído pelo nome do arquivo de entrada (atualmente processado),{.}
pelo nome do arquivo de entrada sem extensão e com{=perl expression=}
você pode executar qualquer coisaperl
, como uma substituição aqui. A saída do seuawk
comando é simplesmente adicionada usando Command Substitution .