Copie um arquivo e adicione um carimbo de data e hora

13

Eu tenho dois problemas com o meu script que copia arquivos e adiciona um carimbo de data e hora ao nome.

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

O texto acima é adicionado Test2como o nome do arquivo, mas eu quero que ele mantenha o nome do arquivo original, que neste exemplo é nomeado Test.

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

O outro problema é que, quando adiciono o %rcódigo como timestamp, recebo o erro informando que o destino "PM" não é um diretório. Estou tentando obter o registro de data e hora como relógio de 12 horas.

Brian
fonte
Adicionar AM / PM adiciona espaço extra ao nome do arquivo. Se você insistir com isso, tente algo como: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (data +% m-% d-% y-% r)"
Romeo Ninov
2
Oudate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Respostas:

12

Um dos seus problemas é que você deixou as aspas duplas em torno da substituição do comando, portanto a saída do datecomando foi dividida em espaços. Consulte Por que meu script de shell engasga com 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 inseri-lo 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 carimbo de data / hora ao nome do arquivo original, pode fazê-lo desta maneira - ${source##*/} expande para o valor sourcesem a parte até a última /(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 Test1for um diretório, ele é copiado recursivamente e os arquivos dentro do diretório mantêm seu nome: somente o diretório de nível superior recebe um carimbo de data / hora anexado (por exemplo, Test1/fooé copiado para Test1-05-10-15-07:19:42 PM). Se você deseja anexar um carimbo de data / hora a todos os nomes de arquivo, esse é um problema diferente.

Sua escolha do formato do carimbo de data e hora é uma péssima idéia: é difícil ler para humanos e difícil de classificar. Você deve usar um formato mais fácil de ler e que possa 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 da hora.

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")"
Gilles 'SO- parar de ser mau'
fonte
Gilles, o primeiro comando não funcionará IMHO, verifique as posições das aspas duplas. E veja meu comentário à pergunta
Romeo Ninov
@RomeoNinov O que há de errado com o primeiro comando? Você o executou e recebeu um erro?
Gilles 'SO- stop be evil'
Você está certo, o comando data é executado na subshell
Romeo Ninov
Gilles, usando o exemplo acima, como copiaria o arquivo com as informações de carimbo de data / hora acima mencionadas em outro diretório. O seguinte comando não funciona:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian
@ Brian Não tenho certeza se entendi seu comentário, mas veja minha edição.
Gilles 'SO- stop be evil'