Adicionando timestamp ao nome do arquivo / dir

1

Eu estou tentando escrever um script, que irá copiar o arquivo ou diretório com timestamp adicionado para filename / dirname

Algo como:

cover.jpg --> cover_18-01-2014_17:37:32.jpg
directory --> directory_18-01-2014_17:37:32

Eu não sei como adicionar o timestamp ao nome do arquivo / dirname. Alguém pode ajudar?

Registro de data e hora

now="$(date +'%d-%m-%Y_%T')"
    
por zdarsky.peter 18.01.2014 / 18:03

3 respostas

0

Eu consegui escrever um script sozinho

#timestamp
now="$(date +'%d-%m-%Y_%T')"

filename=$(basename "$1") 

cp -r "$1"  "$2"

if [ -f "$1" ]; then
   extension="${filename##*.}"
   name="${filename%.*}" 
   mv -f "$2/$filename" "$2/${name}_${now}.$extension"
else
   mv -f "$2/$filename" "$2/${filename}_${now}"
fi
    
por 19.01.2014 / 02:25
2

Com uma implementação de pax cujos regexps suportam o operador \| :

now=$(date +%F_%T)
pax -rw -"s@/\(\([^/]*\)\(\.[^/]*\)\|\([^/.]*\)\)@/_$now@g" . /dest/

Eu realmente recomendo usar o formato 2014-01-18, já que não é ambíguo e funciona da mesma maneira, lexicograficamente e cronologicamente.

Se você não tiver pax , mas tiver o GNU tar , poderá escrevê-lo:

tar -cf - --transform="s@/\(\([^/]*\)\(\.[^/]*\)\|\([^/.]*\)\)@/_$now@g" . |
  (cd /dest && tar xf -)

Em ambos os casos, se houver links simbólicos, a substituição também se aplica ao destino do symlink e é improvável que seja feito apropriadamente, a menos que todos os destinos de link estejam no formato ./some/thing .

    
por 18.01.2014 / 19:03
0

Isso ajudaria se você adicionasse o script que estava tentando depurar, mas aqui está o que eu estaria fazendo. Você deve especificar dois argumentos para o script, incluindo a barra ao lado dos caminhos (ele não insere a validação para permanecer breve).

$ datestamp-cp.sh /path/to/source/ /path/to/destination/

Conteúdo do datestamp-cp.sh

#/bin/env sh
SRC=$1
DST=$2
NOW=$(date +'%d-%m-%Y_%T')

for F in 'ls $SRC'; do
  EXT='rev $F|cut -d. -f1'
  NAM=${F##*.}
  cp -r $SRC$F $DST$NAM-$NOW.$EXT
done

Se você quiser que cada arquivo tenha a hora exata em que foi movido (correspondente ao timestamp), mova a linha NOW = dentro do loop FOR.

Não se esqueça de tornar o script executável

chmod u+x datestamp-cp.sh
  • este é o sudo-code e não foi testado
por 18.01.2014 / 22:54