Substitui alguns caracteres em uma certa parte do nome do arquivo

0

No Solaris, eu tenho um script que faz isso com sucesso:

USER,REPORT_NAME,DD:MM:HH24.pdf -> USER,REPORT_NAME,DD_MM_HH24.pdf

O one-liner é este:

for f in *:*; do mv "$f" $(echo "$f" | tr ':' '_'); done

Mas agora, tenho que desfazê-lo e também filtrar por data de criação (relatórios gerados nos últimos 15 dias, por exemplo). Então, para os relatórios gerados nos últimos 15 dias, tenho que fazer isso renomear:

USER,REPORT_NAME,DD_MM_HH24.pdf -> USER,REPORT_NAME,DD:MM:HH24.pdf

Como posso substituir apenas os caracteres ( _ ) na parte DD_MM_HH24 e não tocar na parte REPORT_NAME do nome do arquivo? E filtrar por data de modificação os relatórios?

Solução posible: Eu vim com uma solução não muito elegante .. Está executando 2 vezes o comando, para substituir a última ocorrência de "_" de cada vez:

$ echo "ADMIN,IN_CO_GE,17-09-2015,11_17_06.pdf" |  sed 's/\(.*\)_/:/'
ADMIN,IN_CO_GE,17-09-2015,11_17:06.pdf
$ echo "ADMIN,IN_CO_GE,17-09-2015,11_17:06.pdf" |  sed 's/\(.*\)_/:/'
ADMIN,IN_CO_GE,17-09-2015,11:17:06.pdf

Solução final Graças ao caos, esta é a solução final para o meu problema:

for f in *; do mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1'); done
    
por Aitor 22.09.2015 / 09:05

1 resposta

1

Você pode usar awk para isso:

for f in *; do
  mv "$f" $(echo "$f" | awk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done

Isso substituirá o _ por : , mas somente no último campo delimitado por , :

  • -F, conjuntos awk s delimitador para ,
  • OFS=","; define o separador de campo de saída como ,
  • gsub(...) substitui todo _ por : no último campo $NF
  • O 1 no final é uma condição verdadeira, em que awk imprime a linha inteira.

Editar : no Solaris, você precisa usar nawk (que é o único awk no sistema Solaris que possui a função gsub() ) em vez do antigo awk :

for f in *; do
  mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done

Editar 2 : para arquivos cujo mtime seja mais recente que 30 dias:

for f in *; do
  [ $(stat -c %Y "") -gt $(expr $(date +%s) - 30 \* 86400) ] && \
    mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done
    
por 22.09.2015 / 09:21