การต่อท้ายวันที่ปัจจุบันจากตัวแปรไปยังชื่อไฟล์


55

ฉันพยายามต่อท้ายวันที่ปัจจุบันต่อท้ายชื่อไฟล์ดังนี้:

TheFile.log.2012-02-11

นี่คือสิ่งที่ฉันมี:

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

อย่างไรก็ตามสิ่งที่ฉันได้รับคือชื่อของไฟล์และจะไม่มีการต่อท้าย ฉันจะต่อท้ายวันที่ปัจจุบันกับชื่อไฟล์ได้อย่างไร


เมื่อคุณ app วันที่ตรวจสอบให้แน่ใจว่าจะไม่ใช้:เพราะมันจะถูกอ่านเป็นโฮสต์ใน rsync และ scp stackoverflow.com/a/37143274/390066
kirill_igum

คำตอบ:


78

setกว่าจะมันเป็นการใช้งานของ ที่จะกำหนด 'today', '=' และผลลัพธ์ของdateโปรแกรมให้กับพารามิเตอร์ตำแหน่ง (หรือที่รู้จักกันว่าอาร์กิวเมนต์บรรทัดคำสั่ง) คุณต้องการเพียงแค่ใช้ C เชลล์ (ซึ่งคุณกำลังติดแท็กสิ่งนี้เป็น "ทุบตี" ดังนั้นไม่น่าจะ) คุณจะต้องใช้:

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

สังเกตการขาดช่องว่างรอบเครื่องหมายเท่ากับ

คุณไม่ต้องการใช้&ในตอนท้ายของใบแจ้งยอด ซึ่งทำให้เชลล์ไม่รอให้คำสั่งเสร็จสิ้น โดยเฉพาะอย่างยิ่งเมื่อใครคนหนึ่งต้องพึ่งพาต่อไป คำสั่งอาจล้มเหลวเพราะมันจะเริ่มต้นก่อนfindmkdir


ขอบคุณสำหรับเพื่อนคนนั้นตอนนี้มันทำงานได้ 100% แล้วตอนนี้ไชโยสำหรับเฮดอัพ & และ mkdir
I AM L

55

Bash script เพื่อฉีดวันที่ในชื่อไฟล์:

รหัสทุบตีนี้ในไฟล์ที่เรียกว่า a.sh

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

เมื่อทำงานพิมพ์:

eric@dev ~ $ chmod +x a.sh

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

คำอธิบายของรหัส:

ตีความสคริปต์ด้วยตัวแปล / bin / bash สร้างตัวแปรใหม่ที่เรียกว่าวันนี้ ดำเนินการคำสั่ง date ผ่านในแฟล็ก Y, m, d, H, M, S เพื่อกำหนดค่าเอาต์พุต วางผลลัพธ์ลงในตัวแปรวันที่

สร้างตัวแปรใหม่ชื่อ filename ล้อมรอบตัวแปร $ today พร้อมกับชื่อไฟล์คงที่ จากนั้นให้สะท้อนชื่อไฟล์ไปยังหน้าจอ

อัดเข้าไปในซับเดียวเพื่อเพิ่ม lulz:

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

5

คุณดูเหมือนจะสับสนหลายอย่าง

set today = 'date +%Y'ดูเหมือนว่าไวยากรณ์ tcsh แต่แม้ใน tcsh มันกำหนดสตริงdate +%Yให้กับตัวแปรtodayก็ไม่ได้เรียกใช้dateคำสั่ง เนื่องจากคุณอาจใช้ bash หรือ POSIX เชลล์อื่น ๆ ไวยากรณ์ของการมอบหมายคือtoday=some_value(โดยไม่มีช่องว่างรอบเครื่องหมายเท่ากับ) ในการรันคำสั่งและกำหนดเอาต์พุตให้กับตัวแปรให้ใช้การทดแทนคำสั่ง :

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

(ฉันได้ทำตามข้อกำหนดวันที่แล้ว) คุณสามารถใช้ backquotes แทนดอลลาร์วงเล็บ แต่ก็มีแนวโน้มที่จะเป็นความสับสนสายตาด้วยคำพูดไปข้างหน้าและกฎระเบียบสำหรับเมื่อคุณต้องการคำพูดที่อยู่ภายในคำสั่ง backquoted จะสวยซับซ้อนและการดำเนินการขึ้นอยู่กับดังนั้นจึงเป็นเรื่องดีที่จะไม่ติด$(…)(ซึ่ง มีผลเช่นเดียวกันกับไวยากรณ์ saner)

คุณใช้&เมื่อสิ้นสุดคำสั่งหลาย ๆ คำสั่ง ทำให้คำสั่งดำเนินการในพื้นหลังซึ่งไม่ต้องการที่นี่ ฉันสงสัยว่าคุณหมายถึง&&ซึ่งหมายถึงการดำเนินการคำสั่งต่อไปเฉพาะในกรณีที่คำสั่งแรกประสบความสำเร็จ

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

ทางเลือกในการใช้หลังจากแต่ละคำสั่งคือการเริ่มต้นสคริปต์ของคุณด้วย&& set -eสิ่งนี้บอกให้เชลล์หยุดการเรียกใช้งานสคริปต์ทันทีที่คำสั่งใด ๆ ส่งคืนสถานะที่ไม่ใช่ศูนย์ (ยกเว้นคำสั่งที่อยู่ในifเงื่อนไขและอีกสองสามกรณี)

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

findคำสั่งของคุณใช้ได้แต่อาจไม่ได้ทำในสิ่งที่คุณตั้งใจจะทำ (แม้ว่าฉันจะไม่รู้ว่ามันคืออะไร)

คุณกำลังสร้างไดเรกทอรีที่มีและจากนั้นทันทีภายในด้วยmkdir findสิ่งนี้จะไม่เป็นประโยชน์หากไม่มีไดเรกทอรีอยู่แล้ว คุณหมายถึงการสร้างไดเรกทอรีสำหรับบันทึกของวันนี้และย้ายไฟล์ล่าสุดจากThe_Logsไปยังไดเรกทอรีที่ชื่อว่าThe_Logs.2012-02-11หรือไม่

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

หรือคุณหมายถึงการเปลี่ยนชื่อไฟล์บันทึกในวันนี้เพื่อเพิ่มคำต่อท้าย$today? ต้องมีการคำนวณชื่อไฟล์ที่แตกต่างกันสำหรับแต่ละไฟล์ที่จะย้าย

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

โปรดทราบว่าฉันใช้-mtimeเพื่อย้ายไฟล์ตามเวลาที่แก้ไขและไม่ใช่-atimeซึ่งเป็นเวลาที่ไฟล์อ่านครั้งสุดท้าย (หากระบบของคุณติดตามว่า - หากไม่ได้ใช้งาน Atime อาจจะไกลที่สุดเท่าที่ mtime)


3

คุณสามารถเปลี่ยนชื่อไฟล์ที่มีการประทับเวลาต่อท้าย

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

นี้:

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

ควรทำงาน. แม้ว่าดูเหมือนว่าคุณกำลังใช้ csh และวิธีการลบเครื่องหมาย + ของฉันอาจไม่ได้ผลสำหรับคุณ แต่จะไม่เจ็บลอง การใส่ตัวแปรของคุณไว้ในวงเล็บปีกกา {} เป็นความคิดที่ดีเสมอที่จะป้องกันการขยายตัวแปรที่ไม่คาดคิด


ขอบคุณเพื่อนหลังจากเพิ่มการแก้ไขของคุณด้วยคำตอบอื่น ๆ มันทำงานได้ดี
ฉัน L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.