Score:0

Bash: ฟังก์ชั่น / การใช้ชื่อฐานคำสั่งที่ไม่เหมาะสม

ธง ca

สิ่งที่ฉันต้องการในคำสั่งต่อไปนี้คือการค้นหาไฟล์เฉพาะและย้ายไปยังไดเร็กทอรีอื่นในขณะที่ต่อท้าย ".log" ต่อท้ายชื่อไฟล์ปลายทาง

ค้นหา /src/dir/ -type f -mtime +3 -exec mv {} /dst/dir/`basename {}`.log \;

แต่ล้มเหลวเพราะ ชื่อฐาน คำสั่งที่อยู่ใน backticks ทำงานไม่ถูกต้อง $(ชื่อฐาน {}) ก็มีผลเช่นเดียวกัน

mv: ไม่สามารถย้าย /src/dir/foo ไปยัง /dst/dir//src/dir/foo.log: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว

ความคิดใด ๆ ที่จะได้รับการชื่นชม

Score:1
ธง in

นั่นเป็นเพราะเปลือกมองเห็นการ `ชื่อฐาน {}` หรือ $(ชื่อฐาน {}) ก่อนที่จะจัดการกับข้อโต้แย้งเพื่อค้นหาและประมวลผล เขียนสคริปต์ที่ทำสิ่งที่คุณต้องการและรันด้วย -ผู้บริหาร แทน.

ค้นหา ... -exec myscript {} \;

ที่ไหน มายสคริปต์ เป็นสิ่งที่ชอบ

#! /ถัง/sh
mv "$1" /dst/dir/$(ชื่อฐาน "$1").log

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

ค้นหา ... -exec bash -c 'mv "$1" "$(ชื่อฐาน "$1").log"' -- {} \;

แต่ให้ทดสอบโซลูชันดังกล่าวอย่างถูกต้องเพื่อให้แน่ใจว่าการอ้างสิทธิ์และการ Escape ทำงานได้อย่างถูกต้อง

aschkant avatar
ca flag
ขอบคุณ @choroba สำหรับการแบ่งปัน เนื่องจากบรรทัดเป็นส่วนหนึ่งของสคริปต์ ฉันสงสัยว่าฉันสามารถเพิ่มอาร์กิวเมนต์ให้กับ -exec หรือทั้งหมดในบรรทัดเดียวเพื่อให้งานเสร็จได้หรือไม่
in flag
คุณสามารถเพิ่มอาร์กิวเมนต์ได้ แต่คุณไม่สามารถใช้ไวยากรณ์ของเชลล์กับอาร์กิวเมนต์ได้ เว้นแต่ว่าคุณจะพยายามเขียนบางอย่างเช่น `-exec bash -c 'mv "$1" "$(basename "$1").log"' -- {} \;`

โพสต์คำตอบ

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