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
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.
cdate='date +"%Y-%m-%d"'; rename .gz .gz.$cdate *.gz
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
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
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.