Leia os arquivos em subdiretórios e mova para um único local com timestamp

2

Eu tenho um requisito para mover todos os arquivos de vários subdiretórios para um único diretório, adicionando o registro de data e hora a ele.

Estou com a estrutura de diretórios abaixo,

Interface/Temp/GoodsRecipt/GR123/abc.csv, cad.csv    
Interface/Temp/GoodsRecipt/GR456/abc.csv, cad.csv

Eu quero mover os arquivos CSV dos diretórios aleatórios para um único diretório e adicionar o registro de data e hora aos arquivos. O resultado deve ser como abaixo,

Interface/Temp/GoodsRecipt/GRout/abc05082014.csv,  cad05082014.csv, abc06032014.csv, cad06032014.csv

Eu preciso escrever um script de shell e executar de forma independente para esta operação. Qualquer ajuda na criação do script de shell seria muito apreciada.

    
por user3196136 27.10.2015 / 04:48

1 resposta

0

INDIR='./Interface/Temp/GoodsRecipt'
OUTDIR='./Interface/Temp/GoodsRecipt/GRout'

mkdir -p "$OUTDIR"

find "$INDIR"/GR*/ -type f -name '*.csv' | while IFS= read f ; do
  fd=$(date +'%Y%m%d' -d @$(stat -c %Y "$f"))
  bn=$(basename "$f" .csv)
  mv "$f" "$OUTDIR/$bn$fd.csv"
done

NOTA: Eu usei YYYYMMDD aqui em vez de DDMMYYYY. Existem muitas razões pelas quais é um formato de data superior, mas um dos mais importantes é que é o único formato que classifica corretamente.

Outra razão importante é que não é ambíguo, porque ninguém usa YYYYDDMM. Mas 05082014 pode significar "8 de maio de 2014" (se você for americano) ou pode significar "5 de agosto de 2014" (quase em qualquer outro lugar do mundo). Não é seguro usar esse formato porque não há como dizer qual é o significado pretendido.

Se você insistir em usar DDMMAAAA, altere o comando de data para date +'%d%m%Y' :

  fd=$(date +'%d%m%Y' -d @$(stat -c %Y "$f"))
    
por 27.10.2015 / 05:17