คัดลอกไฟล์และเพิ่มการประทับเวลาต่อท้าย


13

ฉันมีสองปัญหากับสคริปต์ของฉันที่คัดลอกไฟล์และเพิ่มการประทับเวลาให้กับชื่อ

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

ดังกล่าวข้างต้นจะเพิ่มTest2เป็นชื่อไฟล์ Testแต่ฉันต้องการที่จะให้ชื่อไฟล์ไฟล์ต้นฉบับซึ่งในตัวอย่างนี้เป็นชื่อ

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

ปัญหาอื่น ๆ คือเมื่อฉันเพิ่ม%rเป็นรหัสเวลาที่ฉันได้รับข้อผิดพลาดระบุว่า "PM" เป้าหมายไม่ได้เป็นไดเรกทอรี ฉันกำลังพยายามที่จะได้รับการประทับเวลาเป็นเวลานาฬิกา 12 ชั่วโมง


การเพิ่ม AM / PM เพิ่มพื้นที่พิเศษในชื่อไฟล์ หากคุณยืนยันที่จะลองใช้งานเช่น: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (วันที่ +% m-% d-% y-% r)"
Romeo Ninov

2
หรือdate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

คำตอบ:


12

หนึ่งในปัญหาของคุณคือคุณทิ้งเครื่องหมายคำพูดคู่ไว้รอบ ๆ การทดแทนคำสั่งดังนั้นผลลัพธ์จากdateคำสั่งจะถูกแยกที่ช่องว่าง ดูเหตุใดเชลล์สคริปต์ของฉันจึงสำลักช่องว่างหรืออักขระพิเศษอื่น ๆ นี่เป็นคำสั่งที่ถูกต้อง:

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

หากคุณต้องการต่อท้ายชื่อไฟล์ดั้งเดิมคุณต้องมีชื่อนั้นในตัวแปร

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

หากคุณกำลังใช้ bash คุณสามารถใช้การขยายรั้งแทน

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

หากคุณต้องการคัดลอกไฟล์ไปยังไดเรกทอรีอื่นและผนวกเวลาประทับลงในชื่อไฟล์ต้นฉบับคุณสามารถทำได้ด้วยวิธีนี้ - ${source##*/} ขยายเป็นค่าที่sourceไม่มีส่วนจนถึงสุดท้าย/(จะลบส่วนนำที่ยาวที่สุดที่ตรงกับรูปแบบ*/):

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

ถ้าTest1เป็นไดเรกทอรีมันจะถูกคัดลอกซ้ำและไฟล์ภายในไดเรกทอรีนั้นจะเก็บชื่อไว้: เฉพาะไดเรกทอรีระดับบนสุดเท่านั้นที่จะได้รับการบันทึกเวลาต่อท้าย (เช่นTest1/fooคัดลอกไปยังTest1-05-10-15-07:19:42 PM) หากคุณต้องการเพิ่มการประทับเวลาให้กับชื่อไฟล์ทั้งหมดนั่นเป็นปัญหาที่แตกต่างออกไป

รูปแบบการประทับเวลาที่คุณเลือกเป็นแนวคิดที่ไม่ดี: มันยากที่จะอ่านสำหรับมนุษย์และยากต่อการจัดเรียง คุณควรใช้รูปแบบที่อ่านง่ายขึ้นและสามารถเรียงได้ง่ายเช่นส่วนต่าง ๆ ในลำดับความสำคัญลดลง: ปี, เดือน, วัน, ชั่วโมง, นาที, วินาทีและแยกจากส่วนวันที่และส่วนเวลา

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 คำสั่งแรกจะไม่ทำงาน IMHO ตรวจสอบตำแหน่งของเครื่องหมายคำพูดคู่ และดูความคิดเห็นของฉันกับคำถาม
Romeo Ninov

@RomeoNinov เกิดอะไรขึ้นกับคำสั่งแรก? คุณเรียกใช้และได้รับข้อผิดพลาดหรือไม่?
Gilles 'หยุดความชั่วร้าย' Gilles

คุณถูกต้องคำสั่งวันที่จะดำเนินการใน subshell
Romeo Ninov

Gilles โดยใช้ตัวอย่างด้านบนของคุณฉันจะคัดลอกไฟล์ด้วยข้อมูลเวลาที่ระบุข้างต้นไปยังไดเรกทอรีอื่นได้อย่างไร คำสั่งต่อไปนี้ใช้ไม่ได้:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian

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