Salin file dan tambahkan cap waktu

13

Saya punya dua masalah dengan skrip saya yang menyalin file dan menambahkan stempel waktu ke nama.

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

Di atas menambahkan Test2sebagai nama file, tapi saya ingin menyimpan nama file file sumber asli yang dalam contoh ini dinamai Test.

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

Masalah lainnya adalah ketika saya menambahkan %rkode timestamp saya mendapatkan kesalahan yang menyatakan bahwa target "PM" bukan direktori. Saya mencoba untuk mendapatkan stempel waktu 12 jam.

Brian
sumber
Menambahkan AM / PM menambahkan ruang ekstra dalam nama file. Jika Anda bersikeras untuk mencoba sesuatu seperti: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (tanggal +% m-% d-% y-% r)"
Romeo Ninov
2
Ataudate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Jawaban:

12

Salah satu masalah Anda adalah bahwa Anda meninggalkan tanda kutip ganda di sekitar substitusi perintah, sehingga output dari dateperintah terpecah pada spasi. Lihat Mengapa skrip shell saya tercekik di spasi putih atau karakter khusus lainnya? Ini adalah perintah yang valid:

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

Jika Anda ingin menambahkan nama file asli, Anda harus memilikinya dalam variabel.

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

Jika Anda menggunakan bash, Anda dapat menggunakan ekspansi brace sebagai gantinya.

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

Jika Anda ingin menyalin file ke direktori lain, dan menambahkan stempel waktu ke nama file asli, Anda dapat melakukannya dengan cara ini - ${source##*/} perluas nilai sourcetanpa bagian hingga yang terakhir /(menghapus awalan terpanjang yang cocok dengan pola) */):

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

Jika Test1direktori, disalin secara rekursif, dan file di dalam direktori tetap namanya: hanya direktori tingkat atas yang mendapat cap waktu ditambahkan (misalnya Test1/foodisalin ke Test1-05-10-15-07:19:42 PM). Jika Anda ingin menambahkan cap waktu ke semua nama file, itu masalah yang berbeda.

Pilihan format cap waktu adalah ide yang buruk: sulit dibaca untuk manusia dan sulit untuk disortir. Anda harus menggunakan format yang lebih mudah dibaca dan yang dapat diurutkan dengan mudah, yaitu dengan bagian-bagian dalam urutan kepentingan yang menurun: tahun, bulan, hari, jam, menit, detik, dan dengan pemisahan antara bagian tanggal dan bagian waktu.

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 'SANGAT berhenti menjadi jahat'
sumber
Gilles, perintah pertama tidak akan berfungsi IMHO, periksa posisi tanda kutip ganda. Dan lihat komentar saya untuk pertanyaan
Romeo Ninov
@RomeoNinov Apa yang salah dengan perintah pertama? Apakah Anda menjalankannya dan mendapatkan kesalahan?
Gilles 'SANGAT berhenti menjadi jahat'
Anda benar, perintah tanggal dijalankan dalam subkulit
Romeo Ninov
Gilles, menggunakan contoh Anda di atas, bagaimana saya menyalin file dengan informasi cap waktu yang disebutkan di atas ke direktori lain. Perintah berikut ini tidak berfungsi:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian
@ Brian Saya tidak yakin saya mengerti komentar Anda, tetapi lihat edit saya.
Gilles 'SANGAT berhenti menjadi jahat'