เปลี่ยนชื่อไฟล์ในโฟลเดอร์ท้องถิ่นเพิ่มคำนำหน้าหรือคำต่อท้าย


12

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

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

เพื่อเพิ่มคำนำหน้าให้กับไฟล์ทั้งหมดที่ลงท้ายด้วย.jpg(และถ้าฉันลบออก.jpgมันจะเพิ่มคำนำหน้าให้กับไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบัน)

อย่างไรก็ตามฉันต้องการที่จะสามารถ

  • เพิ่ม sufix (นั่นคือเปลี่ยนชื่อfilename.extเป็นfilename.whatever.ext)
  • ตรวจสอบว่าคำนำหน้าหรือคำต่อท้ายมีอยู่แล้วและข้าม
  • สร้างนามแฝงที่ยอมรับข้อโต้แย้งเช่นaddprefix whatever *.extหรือaddsufix whatever *.*

คำตอบ:


10

หากคุณกำลังใช้bashแล้วนี้หนึ่งซับสามารถทำเพื่อคุณ (สมมติว่าคุณมีตัวแปร$prefix, $suffixและ$extensionพร้อมใช้งาน)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

คุณอาจให้สคริปต์ของคุณเป็นแบบนี้

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

และ

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done

เกือบจะสมบูรณ์แบบแล้ว! มันจะสมบูรณ์หากตรวจสอบ (1) ว่าคำนำหน้าหรือคำต่อท้ายมีอยู่แล้ว (และข้ามไป) และ (2) ทำงานกับไฟล์ที่ไม่มีนามสกุล ขออภัยที่รบกวนมาก ...
ผู้ชายบราซิลนั่น

สำหรับ (1) คุณสามารถ (ฉันคิดว่าไม่ทดสอบ) เพิ่มการตรวจสอบคำนำหน้าโดยการตัด mv ในif [ $f == $prefix* ]และคุณสามารถเปลี่ยนคำต่อท้ายด้วยif [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]คำสั่ง mv สองคำใน adduffix สำหรับ (2) มันควรจะทำงานกับไฟล์ที่ไม่มีนามสกุลเว้นแต่ฉันเป็นโปรแกรมเมอร์ที่น่ากลัว
Aaron Okano

7

มีคำสั่งPerlrenameที่ควรทำเคล็ดลับ แต่ระวัง: มีคำสั่งที่แตกต่างกันหลายชื่อrenameดังนั้นให้แน่ใจว่าคุณมีสคริปต์ Perl ที่คาดว่าจะperlexprเป็นอาร์กิวเมนต์ นี่คือrenameคำสั่งให้โดยperlแพคเกจใน Debian และสัญญาซื้อขายล่วงหน้า (อูบุนตู, มิ้นท์, ... ) แต่ไม่ได้อยู่ในการแจกแจงอื่น ๆ renameที่อาจมียูทิลิตี้ที่แตกต่างกันเรียกว่า

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

อย่างที่คุณเห็นมันคือidempotent - มันจะไม่เพิ่มคำนำหน้าอีกครั้งเมื่อคุณเรียกมันหลายครั้ง

มันทำงานโดยการแทนที่ (ความยาวเป็นศูนย์) เริ่มต้นของสตริง ( ^) หรือเริ่มต้นตามด้วยตัวเลือกสตริงกับprefixprefix

ฉันจะออกจากแค็ปซูลนี้ในทั้งเชลล์สคริปต์หรือฟังก์ชั่นเชลล์เป็นแบบฝึกหัดสำหรับคุณ :)

Postfix นั้นค่อนข้างยากกว่าเพราะคุณต้องเข้าใจว่าส่วนใดของชื่อไฟล์ที่ถือว่าเป็นส่วนขยาย ...


นั่นเป็นคำตอบที่ดี แต่ฉันกำลังมองหาบางสิ่งที่เป็นสากลมากกว่า สำหรับคำตอบนี้คุณต้องการทั้ง perl และ specific (หรือเทียบเท่า) ที่renameมีอยู่ และฉันรู้ว่าคำต่อท้ายนั้นยากขึ้นเล็กน้อยมันไม่ได้ครอบคลุมในคำถามที่เชื่อมโยงและฉันเป็นผู้เริ่มต้นใน linux, bash, shell script, perl และการแสดงออกปกติดังนั้น "ยากขึ้นเล็กน้อย" สำหรับฉัน ! :)
Guy บราซิลนั่น

4

ด้วยzsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~เป็นผู้ประกอบการ globbing ที่หมายถึงยกเว้นzshใน


1

ตัวอย่างง่ายๆในการเปลี่ยนคำนำหน้าและส่วนขยายของรูปภาพทั้งหมดในโฟลเดอร์ปัจจุบัน

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

หากคุณต้องการตรวจสอบว่ามันจะมีผลต่อข้อมูลของคุณก่อนที่จะเปลี่ยนมันแทนที่mvโดยecho

เอาต์พุตสำหรับ IMG_7993.JPG คือ EG_IMG_7993.jpg

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