Copie um arquivo e anexe um timestamp

11

Eu tenho dois problemas com o meu script que copia arquivos e adiciona um timestamp ao nome.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

O texto acima adiciona Test2 como o nome do arquivo, mas eu quero que ele mantenha o nome do arquivo do arquivo de origem original, que neste exemplo é denominado Test .

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

O outro problema é quando eu adiciono o %r como o código do timestamp. Eu recebo o erro informando que o alvo "PM" não é um diretório. Estou tentando obter o timestamp como o horário do relógio de 12 horas.

    
por Brian 10.05.2015 / 20:59

1 resposta

9

Um dos seus problemas é que você deixou de fora as aspas duplas em torno da substituição do comando, então a saída do comando date foi dividida em espaços. Veja Por que meu script de shell sufocar em espaços em branco ou outros caracteres especiais? Este é um comando válido:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Se você deseja anexar ao nome do arquivo original, é necessário ter isso em uma variável.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Se você estiver usando o bash, poderá usar a expansão de chaves.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Se você deseja copiar o arquivo para um diretório diferente e anexar o registro de data e hora ao nome do arquivo original, você pode fazê-lo desta forma - ${source##*/} expande para o valor de source sem a parte até o último / (remove o prefixo mais longo que corresponde ao padrão */ ):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Se Test1 for um diretório, ele será copiado recursivamente e os arquivos dentro do diretório manterão seu nome: somente o diretório de nível superior receberá um registro de data e hora anexado (por exemplo, Test1/foo é copiado para Test1-05-10-15-07:19:42 PM ). Se você deseja anexar um registro de data e hora a todos os nomes de arquivos, isso é um problema diferente.

Sua escolha do formato de registro de data e hora é uma má ideia: é difícil de ler para humanos e difícil de classificar. Você deve usar um formato mais fácil de ler e que pode ser classificado facilmente, ou seja, com partes em ordem decrescente de importância: ano, mês, dia, hora, minuto, segundo e com uma separação entre a parte da data e a parte do tempo.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"
    
por 10.05.2015 / 21:25