Renomeie vários arquivos e adicione data antes dos arquivos

1

Eu tenho uma pasta que contém um ou mais arquivos tar.gz. Eu quero adicionar a data atual antes de cada arquivo quando o script é executado.

Por exemplo:

Dois nomes de arquivos (esses arquivos serão criados todos os dias, mas o nome permanecerá o mesmo):

file1.tar.gz 
file2.tar.gz

No primeiro dia (2011-10-07), esses dois arquivos serão renomeados para:

2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz

No dia seguinte (2011-10-08), eles são alterados para:

2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz

Por fim, a pasta contém os seguintes arquivos:

2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz
2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz

Como conseguir isso usando uma linha? Tentei usar o comando "rename", mas só posso adicionar a data após o arquivo, não antes.

Meu código

cdate='date +"%Y-%m-%d"'; rename .gz .gz.$cdate *.gz
    
por garconcn 07.10.2011 / 20:19

4 respostas

6

Claramente, a chave é evitar renomear arquivos que já tenham um prefixo de data.

cdate=$(date +"%Y-%m-%d")
shopt -s extglob
for file in !([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.gz); do
  mv "$file" "${cdate}_$file"
done
    
por 07.10.2011 / 20:35
3

Seu código de exemplo pode gerar coisas como file1.2011-10-07.2011-10-08.tar.gz e duvido que você queira.

Além disso, rename não é um comando padrão, então realmente depende do que o seu faz.

Como você diz que há sempre um número fixo de arquivos com nomes fixos, provavelmente é possível usar um script simples como:

cdate=$(date +%Y-%m-%d)
for file in file1.tar.gz file2.tar.gz; do
    mv "$file" "$cdate"_"$file"
done
    
por 07.10.2011 / 20:32
0

Assumindo que os arquivos nunca conterão sublinhados em seus nomes, uma simples solução bash 4+ seria usar extglob :

shopt -s extglob
today=$(date +%F)
for f in ./!(*_*).tar.gz; do mv "$f" "$today"_"$f"; done

Uma versão mais robusta:

shopt -s extglob
today=$(date +%F)
for f in ./!(????-??-??_*).tar.gz; do mv "$f" "$today"_"$f"; done
    
por 27.06.2013 / 22:29
0

Você pode fazer isso sem recorrer a bashisms (loops e / ou extglob) e apenas usar find, cut, grep e xargs.

find . -maxdepth 1 -type f | \
    cut -c3- | \
    grep -v '^\.' | \
    grep -v '^[0-9][0-9][0-9][0-9]\-[0-9][0-9]-[0-9][0-9]_' | \
    xargs -n 1 -I {} echo mv "{}" "'date +"%Y-%m-%d"'_{}"

Remova o echo para aplicar as alterações, em vez de apenas imprimir os comandos mv.

    
por 26.10.2017 / 09:45

Tags