Arquivo de backup com extensão de nome de arquivo .bak _before_

5

Eu geralmente faço backup de arquivos de configuração em servidores sem controle de versão da seguinte forma:

# cp httpd.conf{,.bak}
# ls
httpd.conf    httpd.conf.bak

No entanto, para arquivos na raiz da web, dedico um tempo para colocar cuidadosamente .bak antes da extensão do nome do arquivo para que .php permaneça e o Apache ainda envie o arquivo por meio do interpretador PHP se alguém conseguir adivinhar ou sondar o servidor para esses arquivos:

$ cp index.php index.bak.php
$ ls
index.php    index.bak.php

Existe alguma maneira de usar preenchimento de tabulação e memória muscular para colocar o .bak antes da extensão do nome do arquivo? Eu tenho Tab{}←,.bak queimado na memória muscular e não posso usar essa boa "macro de carne" em arquivos na raiz da Web.

Obrigado.

    
por dotancohen 28.02.2013 / 08:11

4 respostas

3

Pode ser tão simples quanto

cp file.{ext,bak.ext}
A expansão do

bash {} se expande para todas as combinações (ao contrário da [[] expansão que lista os arquivos existentes. Por isso, gera dois nomes de arquivos.

O {...., ....} oferece duas opções, para que você obtenha file.ext e file.bak.ext

No seu script você usaria

cp $FILE.{$EXTENTION,bak.$EXTENTION}

E para dividir o FILENAME nas duas metades, você pode usar

FILE=${FILENAME%.*}
EXTN=${FILENAME##*.}

$ {VAR% xxxxx} retornará o lado esquerdo do que está em VAR até o padrão correspondente, no caso acima do padrão. * para que você obtenha tudo, exceto o último. *

$ {VAR ## xxxxx} retornará o lado direito do que está em VAR, após o padrão correspondente. O hash duplo significa obter a maior correspondência possível, caso haja mais de uma correspondência possível.

Para fazer seu script salvar, verifique os casos em que após obter FILE e EXTENTION, eles não são a mesma coisa. Isso acontecerá nos casos em que o nome do arquivo não tiver uma extensão.

Uma subseção do seu script pode ter esta aparência:

ls *html | while read FILENAME
do
    FILE=${FILENAME%.*}
    EXTN=${FILENAME##$FILE}
    cp $FILE{$EXTN,.bak$EXTN}
done
    
por 28.02.2013 / 08:45
5

Você sempre pode usar uma função:

backup()
  for i do
    case ${i##*/} in
      (?*.?*) cp -iv -- "$i" "${i%.*}.bak.${i##*.}";;
      (*) cp -iv -- "$i" "$i.bak"
    esac
  done

${i##*/} é o nome de base de $i (ou seja, $i com tudo até a parte mais à direita / removed), porque não queremos considerar bar/file como a extensão em foo.bar/file .

Em seguida, verificamos se $i contém uma extensão, ou seja, se ela contém pelo menos um caractere dot com caracteres em ambos os lados ( ?* é qualquer caractere seguido por 0 ou mais caracteres , então é um ou mais caracteres ). Não podemos fazer *.* , caso contrário, teríamos o backup de ~/.bashrc as ~/.bak.bashrc , por exemplo.

Essa sintaxe acima é POSIX, exceto a opção -v (para verbose ) para cp , que é uma extensão GNU, também encontrada em algumas outras implementações como o BSDs.

Então você pode fazer coisas como:

backup foo.php bar.html baz<Tab>...

Ou:

backup *.php

Sem ter que se preocupar com a perda de dados ( -i solicitará confirmação antes de sobrescrever um arquivo, veja também a opção -b com GNU cp ) ou não escolhendo o nome correto.

    
por 28.02.2013 / 08:53
2

Não consigo pensar em uma maneira de fazer isso com a conclusão da tabulação, exceto possivelmente também manter uma cópia do nome do arquivo sem a extensão, para que você possa adicionar "bak.php" de uma só vez. Mas a minha solução para isso seria um pequeno script de shell, que leva um nome de arquivo como entrada e copia para "firstpart.bak.extension".

    
por 28.02.2013 / 08:45
0

Eu tenho esse problema para vários sistemas unix sem controle de origem com um requisito para fazer pequenas alterações rapidamente. Para casos como esse, eu acertei o arquivo com um script para cortar uma cópia carimbada da hora para permitir uma recuperação rápida. ls mostra os arquivos com a data das versões classificadas pelo nome do arquivo depois dele.

if [ "$1" = "" ]; then
   echo "File name required. Aborting."
   exit 1
fi

CDATE='date +%Y-%m-%d-%H-%M'
cp "$1" "$1-$CDATE"
echo File backed up to: $1-$CDATE

Uso:

VERS.sh httpd.conf

Saída:

File backed up to: httpd.conf-2016-07-14-10-27
    
por 14.07.2016 / 02:33

Tags