Menambahkan tanggal saat ini dari variabel ke nama file

55

Saya mencoba untuk menambahkan tanggal saat ini ke akhir nama file seperti ini:

TheFile.log.2012-02-11

Inilah yang saya miliki sejauh ini:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

Namun yang saya dapatkan hanyalah nama file tersebut, dan tidak ada tambahannya. Bagaimana cara menambahkan tanggal saat ini ke nama file?

SAYA ADALAH SAYA
sumber
ketika Anda meng-apppand date, pastikan untuk tidak menggunakan :karena itu akan dibaca sebagai host di rsync dan scp. stackoverflow.com/a/37143274/390066
kirill_igum

Jawaban:

78

Kemungkinan besar itu adalah penggunaan Anda terhadap set. Itu akan menetapkan 'hari ini', '=' dan output dateprogram ke parameter posisi (alias argumen baris perintah). Anda hanya ingin menggunakan shell C (yang Anda beri tag ini sebagai "bash", jadi kemungkinan tidak), Anda ingin menggunakan:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

Perhatikan kurangnya ruang di sekitar tanda sama dengan.

Anda juga tidak ingin menggunakan &di akhir pernyataan Anda; yang menyebabkan shell tidak menunggu perintah selesai. Terutama ketika seseorang mengandalkan yang berikutnya. The findperintah bisa gagal karena dimulai sebelum mkdir.

Arcege
sumber
Terima kasih untuk jodohnya, sekarang berfungsi 100%, Cheers for the head-up & and mkdir
I AM L
55

Skrip Bash untuk menyuntikkan tanggal ke nama file:

Kode bash ini dalam file disebut a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

Saat dijalankan, cetak:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Penjelasan kode:

Menafsirkan skrip dengan penerjemah / bin / bash. Buat variabel baru yang disebut hari ini. Jalankan perintah tanggal, lewat bendera Y, m, d, H, M, S untuk mengkonfigurasi output. Tempatkan hasilnya ke dalam variabel tanggal.

Buat variabel baru bernama nama file, mengelilingi variabel $ today dengan sisa teks nama file statis. lalu gema nama file ke layar.

Cram itu menjadi satu-liner untuk meningkatkan lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
Eric Leschinski
sumber
5

Anda tampaknya telah mencampuradukkan beberapa hal.

set today = 'date +%Y'terlihat seperti sintaks tcsh, tetapi bahkan dalam tcsh ia memberikan string date +%Yke variabel today, itu tidak menjalankan dateperintah. Karena Anda mungkin menggunakan bash atau shell POSIX lainnya, sintaks dari suatu tugas adalah today=some_value(tanpa spasi di sekitar tanda sama dengan). Untuk menjalankan perintah dan menetapkan outputnya ke variabel, gunakan substitusi perintah :

today=$(date +%Y-%m-%d)

(Saya juga telah menyelesaikan spesifikasi tanggal). Anda dapat menggunakan backquotes alih-alih tanda kurung dolar, tetapi cenderung menjadi bingung secara visual dengan forward quotes, dan aturan ketika Anda membutuhkan kutipan di dalam perintah backquoted cukup kompleks dan bergantung pada implementasi, jadi lebih baik tidak berpegang teguh pada $(…)(yang memiliki efek yang sama dengan sintaksis saner).

Anda menggunakan &di akhir beberapa perintah. Itu membuat perintah dieksekusi di latar belakang, yang tidak diinginkan di sini. Saya menduga Anda maksud &&, yang berarti mengeksekusi perintah berikutnya hanya jika perintah pertama berhasil.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

Alternatif untuk menggunakan &&setelah setiap perintah adalah memulai skrip Anda set -e. Ini memberitahu shell untuk berhenti mengeksekusi skrip segera setelah perintah apa pun mengembalikan status bukan nol (kecuali untuk perintah dalam ifkondisi dan beberapa kasus lainnya).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

findPerintah Anda baik-baik saja tetapi mungkin tidak melakukan apa yang ingin Anda lakukan (meskipun saya tidak tahu pasti apa itu).

Anda sedang membuat direktori dengan mkdirdan kemudian segera melewatinya find. Itu tidak akan berguna kecuali direktori sudah ada. Apakah Anda bermaksud membuat direktori untuk log hari ini dan memindahkan file terbaru dari The_Logske direktori bernama eg The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

Atau Anda bermaksud mengganti nama file log hari ini untuk menambahkan akhiran $today? Itu membutuhkan penghitungan nama file yang berbeda untuk setiap file untuk bergerak.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Perhatikan bahwa saya menggunakan -mtime, untuk memindahkan file berdasarkan waktu modifikasi mereka, dan bukan -atime, yang merupakan waktu file terakhir dibaca (jika sistem Anda melacak itu - jika tidak, atime mungkin sejauh mtime).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Anda dapat mengganti nama file dengan cap waktu ditambahkan ke sana

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`
Atul Rokade
sumber
2

Ini:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

harus bekerja. Meskipun, sepertinya Anda menggunakan csh dan solusi saya menghapus tanda + mungkin tidak berfungsi untuk Anda tetapi tidak ada salahnya untuk mencoba. Menutup variabel Anda di kurung kurawal {}, selalu merupakan ide bagus untuk mencegah ekspansi variabel yang tidak terduga.

MelBurslan
sumber
Terima kasih sobat, setelah menambahkan koreksi Anda dengan jawaban lain, itu berfungsi dengan baik.
I AM L