วิธีเพิ่มข้อความลงในชื่อไฟล์เป็นอย่างไร?


44

ช่วยบอกว่าฉันมีไดเรกทอรีที่เต็มไปด้วย.mdไฟล์ทั้งหมดที่มีชื่อต่าง ๆ ช่วยบอกว่าฉันต้องการเติม "ข้อความ" ไว้ที่ด้านหน้าของชื่อไฟล์แต่ละชื่อ ดังนั้นสำหรับตัวอย่างเช่นไฟล์a.md, b.mdและc.mdจะกลายเป็นtest - a.md, และtest - b.mdtest - c.md

ฉันจะทำสิ่งนี้ผ่านบรรทัดคำสั่งได้อย่างไร

คำตอบ:


60

หนึ่งซับที่สามารถพิมพ์ได้ง่ายจากเทอร์มินัล:

for f in *.md; do mv "$f" "test - $f"; done

หรือเขียนใหม่ในบรรทัดที่แยกกันแทนการใช้เครื่องหมายอัฒภาค:

for f in *.md
do
    mv "$f" "test - $f"
done

นิทรรศการ

ไวยากรณ์ของfor(ในsh):

for NAME [in WORDS ... ] ; do COMMANDS; done

ที่นี่เราNAMEเป็นfของเราและเป็นไฟล์ทั้งหมดที่อยู่ในการจับคู่ไดเรกทอรีปัจจุบันWORDS *.mdดังนั้นตัวแปรจะถูกแทนที่ด้วยการจับคู่แต่ละไฟล์$f*.md

ดังนั้นสำหรับa.md:

mv "$f" "test - $f"

กลายเป็น

mv "a.md" "test - a.md"

เครื่องหมายคำพูดมีความสำคัญเนื่องจากชื่อไฟล์แต่ละรายการ$fอาจมีช่องว่าง มิฉะนั้นmvจะคิดว่าแต่ละคำเป็นไฟล์แยกต่างหาก ตัวอย่างเช่นหากไม่มีเครื่องหมายคำพูดและมีไฟล์ที่เรียกว่าFoo Bar.mdมันจะแปลเป็น:

mv Foo Bar.md test - Foo Bar.md

ซึ่งจะไม่ทำงานตามที่ตั้งใจไว้ แต่ด้วยการห่อ$fคำพูดมันสมเหตุสมผล:

mv "Foo Bar.md" "test - Foo Bar.md"

สังเกตไวยากรณ์ของforคุณยังสามารถเปลี่ยนชื่อชุดย่อยของ*.mdไฟล์ทั้งหมดโดยการตั้งชื่อแต่ละอย่างชัดเจน:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

หรือใช้การขยายเชลล์:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

นี่คือสิ่งที่ฉันต้องการเห็น ขอบคุณ!
Ryan

11

หากคุณมีprename...

prename 's/^/test - /' *.md

ใช้คำสั่งเชลล์สามัญ:

for file in *.md; do
    mv "$file" "test - $file"
done

ฉันจะได้รับได้prenameอย่างไร
ก.ย.

ดูเหมือนว่าจะได้รับการติดตั้งสำหรับฉันบน Ubuntu 16.04 LTS คุณได้ลองใช้โปรแกรมจัดการแพ็คเกจ (เช่น. sudo apt-get install) แล้วหรือยัง?
Orion751

5

mmv1 , 2ยังเป็นเครื่องมือที่ดีมากสำหรับงานดังกล่าวนำไปใช้กับงานปัจจุบันก็จะเป็น

mmv '*.md' 'test - #1.md'

แน่นอนถ้าคุณต้องการเพิ่ม "test -" ใน a.md, b.md และ c.md แต่ไม่ใช่ a1.md สิ่งที่ต้องการ

mmv '?.md' 'test - #1.md'

จะเหมาะสมกว่า

ฉันสามารถแนะนำได้โดยเฉพาะถ้าคุณมีปัญหามากมาย

หากคุณกำลังมองหานอกจากนี้อินเตอร์เฟซแบบกราฟิกลองgprename


5

แทนที่จะใช้ลูป for for ซึ่งจะล้มเหลวในช่องว่างเว้นเสียแต่ว่าคุณจะกำหนดตัวแปร IFS อีกครั้งฉันแนะนำให้ใช้ a while loop รวมกับ find ต่อไปนี้จะทำงานเมื่อเรียกใช้จากไดเรกทอรีเดียวกันกับไฟล์

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

บรรทัด "basename" อยู่ในนั้นเพื่อให้การค้นหาจะพิมพ์ชื่อไฟล์เท่านั้น - โดยไม่มีส่วนประกอบของพา ธ ซึ่งจะทำให้การแบ่งการดำเนินการเปลี่ยนชื่อ


2

ฉันรู้ว่ามันสายเกินไป แต่ถ้ามีใครบางคนกำลังมองหาสิ่งนี้สิ่งนี้เหมาะสำหรับฉัน:

rename '' 'name -' *.md

1
ง่ายและตรงไปตรงมา
user13743

0

หากคุณมีzshให้คุณสามารถใช้zmv:

autoload zmv
zmv -w '*' 'test - $1'

คุณสามารถทดสอบคำสั่งด้วย:

zmv -wn '*' 'test - $1'
  • -n หมายถึงแห้งวิ่งคือแสดงเฉพาะสิ่งที่จะเกิดขึ้น
  • -w การใส่เครื่องหมายวงเล็บไว้รอบ ๆ wildcard ทำให้การอ้างอิงกลับทำงาน

0

ในทุบตีเพิ่ม "Prepend text -" ในไฟล์ทั้งหมดในโฟลเดอร์:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

นี่คือวิธีการเขียนที่ยาวเป็นพิเศษfor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.