การเพิ่มข้อความไปยังชื่อไฟล์ก่อนที่จะขยาย


25

ฉันต้องการที่จะเพิ่มข้อความในตอนท้ายของชื่อไฟล์ แต่ก่อนที่จะขยาย ตอนนี้ฉันกำลังพยายาม

for f in *.shp; do echo $f_poly; done

ผลลัพธ์คือ

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

ฉันอยากให้มันเป็น

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

คำตอบ:


27

ใช้การขยายพารามิเตอร์ POSIX มาตรฐาน :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

เจ๋งมากนั่นคือสิ่งที่ฉันต้องการ
Sam007

1
อาจดีกว่าพร้อมคำอธิบายวิธีการใช้งาน ในทางกลับกันคำตอบของดั๊กนั้นค่อนข้างง่าย
Sarge Borsch

@SargeBorsch คุณต้องการอธิบายอะไรบ้าง คำตอบของฉันตัวอย่างในคำถามและคำตอบของ Doug นั้นแตกต่างกันเพียงไม่กี่ตัวอักษรและคำตอบของ Doug อธิบายได้น้อยกว่าของฉันดังนั้นฉันจึงไม่ทราบว่าคุณต้องการอะไร หากคุณเพิ่งเปรียบเทียบความแตกต่างในผลลัพธ์ทั้งสองในคำถามมันควรจะง่ายที่จะเข้าใจว่าพวกเขาทำอะไร ฉันสามารถอธิบายได้ว่าทำไมคำตอบของฉันจึงดีกว่าของดั๊ก 1. การใช้งานผมกับรูปแบบของสตริงแทนการพกพาน้อยprintf echo2. ฉันใช้การขยายพารามิเตอร์ซึ่งมีประสิทธิภาพมากกว่าการเรียกไบนารีภายนอก ( basename) สำหรับงานง่าย ๆ
jw013

จากนั้นคำสั่งให้เปลี่ยนชื่อไฟล์จะเป็นดังนี้:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

บางครั้งมีเครื่องมือที่เรียกว่า "เปลี่ยนชื่อ" ติดตั้ง

rename 's/\.shp$/_poly.shp/' *shp

อาจไม่พกพาสะดวก แต่ใช้งานง่าย


1
นี่เป็นคนเดียวที่ทำงานให้ฉันได้คำตอบที่ดี!
wanderer0810

4

ใช้สิ่งนี้:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
การใช้basenameช้าและมีประสิทธิภาพน้อยกว่าการปล่อยให้เชลล์ทำงานด้วยตัวเอง สิ่งนี้อาจสังเกตได้สำหรับไฟล์จำนวนมาก
jw013

นอกจากนี้ยังมีคำพูดที่ขาดหายไปและและมันล้มเหลวสำหรับชื่อไฟล์ที่มีตัวอักษรขึ้นบรรทัดใหม่ก่อน-- .shp
Stéphane Chazelas

ขอบคุณที่ให้คำตอบที่ฉันสามารถทำงานได้จริงเพื่อวัตถุประสงค์ของฉัน นี่คือวิธีใช้ทุบตีไม่ใช่รหัสกอล์ฟ (อ่านมากกว่านี้ .. ฉันรู้ว่ามันอาจฟังดูเหมือนว่าฉันกำลังประชดประชันมากขึ้นเกี่ยวกับคำตอบอื่น ๆ ที่นี่มากกว่าของคุณขอบคุณอีกครั้ง)
ทิม

3

สิ่งนี้ใช้ได้ผลดีกว่าสำหรับฉัน:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


ดีลักษณะนี้เป็นจำนวนมากเช่นคำตอบที่ได้รับการยอมรับยกเว้นว่าคุณอาจต้องการfor f in *.webmคุณลืมที่จะพูดและคุณหายไป${f} --
Stéphane Chazelas

1
คำตอบที่ได้รับการยอมรับไม่ทำงานบน OSX เพียงพิมพ์ชื่อไฟล์ใหม่เท่านั้นมันไม่ได้เปลี่ยนชื่อไฟล์จริงๆ
Vinnie James

1
แน่นอนมันแสดงให้คุณเห็นวิธีการใช้การขยายเชลล์เพื่อรับชื่อไฟล์ใหม่เพื่อตอบคำถามที่ส่งออกชื่อไฟล์ (ด้วยecho) แต่ไม่ใช่ชื่อที่ต้องการ
Stéphane Chazelas

1

หากอยู่ในสถานที่ต่างกันให้เรียกใช้: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

เนื่องจากคำถามนี้bashไม่มีความจำเป็นสำหรับยูทิลิตีภายนอกเนื่องจากคุณสามารถใช้bash regexps :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.