ไฟล์การเปลี่ยนชื่อแบทช์


150

ฉันมีไดเรกทอรีที่เต็มไปด้วยภาพ:

image0001.png
image0002.png
image0003.png
...

และฉันต้องการหนึ่งสายการบินเพื่อเปลี่ยนชื่อพวกเขาเป็น (พูด)

0001.png
0002.png
0003.png
...

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


8
นี่เป็นหนึ่งในคำถามที่พบบ่อยเกี่ยวกับบรรทัดคำสั่ง Unix และฉันไม่พบมันบนเว็บไซต์นี้อยู่แล้วดังนั้นเราควรสร้าง Wiki ชุมชนนี้หรือไม่
Gilles

5
ฉันไม่เห็นว่าทำไม มันเป็นคำถามเฉพาะพร้อมคำตอบที่ตรวจสอบได้
ชายอินเทอร์เน็ต

3
หากคุณใช้ X มันไม่ได้ง่ายไปกว่าthunar -B *.pngเครื่องมือ gui ที่เปลี่ยนชื่อจำนวนมากของ thunar
dotjoe

@dotjoe ขอบคุณ Thunar น่าสนใจจริงๆ
Volker Siegel

คำตอบ:


105

หากคุณกำลังใช้ Bash หรือเชลล์อื่น ๆ ที่รองรับ POSIX:

for f in *.png; do
    mv -- "$f" "${f#image}"
done

2
นี่เป็นหนึ่งในวิธีการแทนที่พารามิเตอร์ที่แสดงใน Mendel Coopers คู่มือการเขียนสคริปต์ Bash ขั้นสูงtldp.org/LDP/abs/html
W_Whalley

2
@W_Whalley ผมขอแนะนำให้หลีกเลี่ยงการแนะนำว่าในความโปรดปรานของWooledge ทุบตีคู่มือ
Wildcard

@ Wildcard: คุณมีเหตุผลอะไรที่แนะนำให้หลีกเลี่ยงคู่มือ ABS?
Christian Severin

@ChristianSeverin โปรโมชั่นของการปฏิบัติที่ไม่ดีและรหัสเสียทันที ตรวจสอบลิงก์ในหน้าโปรไฟล์ของฉัน
Wildcard

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

108

ใน Debian และอนุพันธ์renameผลงานของ Perl ก็คล้ายกันsedดังนี้:

  rename -v 's/image//' *.png

นอกจากนี้ยังมีrenameจากutil-linuxที่ทำงานเช่นนี้แทน:

  rename image '' *.png

6
คุณควรอธิบายว่านี่เป็นโปรแกรมภาษา Perl ที่อาจต้องทำการติดตั้งและต้องใช้นิพจน์ทั่วไปเป็นอาร์กิวเมนต์

อาฉันไม่รู้เรื่องนั้น ฉันจะให้เครดิตกับคำตอบที่ยอมรับเมื่อฉันระบุมัน :)
คนอินเทอร์เน็ต

5
renameโปรแกรมนี้มาจากการกระจายตัวอย่าง Perl Debian และ Ubuntu /usr/bin/renameจัดส่งเป็น สายพันธุ์ Unix อื่น ๆ /usr/bin/renameอาจไม่ให้มันหรืออาจให้แตกต่างอย่างสิ้นเชิง
Gilles

1
บางรุ่นrenameใช้เวลาจาก การรูปแบบการเปลี่ยน:rename [options] <expression> <replacement> <file>...
ผสมผสาน

1
หากคุณใช้ระบบที่ใช้ Debian ให้เปลี่ยนชื่อการติดตั้ง sudo apt-get แล้วคุณสามารถใช้คำสั่ง rename มันน่าเบื่อสำหรับชื่อไฟล์
ctrl-alt-delor

41

zmv

เปลือก zsh zmvมีคำสั่งที่มีประสิทธิภาพชุดเปลี่ยนชื่อเรียกว่า

แรกที่คุณต้องเปิดการใช้งานzmvคำสั่งดังต่อไปนี้ (นี้สามารถไปลงในของคุณ~/.zshrc)

autoload zmv

zmv PATTERN REPLACEMENTไวยากรณ์พื้นฐานคือ รูปแบบคือการแสดงออกของเปลือกกลม ส่วนของลวดลายสามารถล้อมรอบด้วยวงเล็บ ข้อความแทนที่สามารถมี$1, $2ฯลฯ เพื่ออ้างถึงกลุ่ม parenthesised ชับในรูปแบบ ตัวอย่างเช่น:

zmv 'image(*.png)' '$1'

นอกจากนี้คุณยังสามารถขอ zsh เพื่อกำหนดโดยอัตโนมัติ$1, $2ฯลฯ เพื่อให้ตรงกับอักขระตัวแทนในรูปแบบ:

zmv -w 'image*.png' '$1.png'

4
sweeeeeeeeeeeeeeeeeet อีกเหตุผลที่ฉันควรจะเรียนรู้ zsh
ixtmixilix

1
@ixtmixilix จะเรียนรู้อะไรดี? เพียงแค่เริ่มใช้งานและอาจเพิ่ม prezto ( github.com/sorin-ionescu/prezto ) สำหรับความพิเศษสุด ๆ
เจอร์รี่

เจ๋งจริง ๆ ตามที่ชี้ไปที่คนของ zmv สิ่งนี้สามารถทำให้ง่ายขึ้นโดยการเพิ่มนามแฝง mmv = 'noglob zmv -W' ถึง: mmv * .c.orig orig / *. c
Bretsko

การเปิดใช้งานzmvprezto ต้องไม่ใส่เครื่องหมายในบรรทัดใน ~ / .zpreztorc ของคุณหลังจากการ# Set the Zsh functions to load (man zshcontrib).ให้zstyle ':prezto:load' zfunction 'zargs' 'zmv'

33

ปกติแล้วฉันจะใช้ยูทิลิตี้mmv ( หน้าคน ) ที่ดีและเรียบง่ายสำหรับ usecase นี้:

$ mmv "image*.png" "#1.png"

จะทำงานของคุณ

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

ตรวจสอบให้แน่ใจเพื่อป้องกันรูปแบบจากเชลล์โดยการอ้างอิง


ขอบคุณที่ชี้ยูทิลิตี้นี้ ฉันพบมันในที่เก็บ Debian, Ubuntu และ Cygwin ฉันมีปัญหากับ man page แต่พบหน้าเว็บบางหน้าและคำถาม Stack Overflow ที่ช่วยอธิบายว่าคุณใช้มันอย่างไร stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley

ขอบคุณฉันได้เพิ่มข้อมูลเพิ่มเติมลงในคำตอบเพื่อให้ชัดเจนยิ่งขึ้น
Marcel Stimberg

3
ไม่สามารถลงคะแนนได้มากพอ! มันง่ายและเป็นมิตร พร้อมใช้งานสำหรับ OS X ใน homebrew
Greg Dubicki


6

ฉันชอบ Perl ดังนั้น:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

คุณยังสามารถใช้รูปแบบเดียวกันสำหรับงานอื่น ๆ เช่นการคัดลอกไฟล์ไปยังไดเรกทอรีอื่น:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'

2
หรือ (ปลอดภัยยิ่งขึ้น):rename($old,$_)
reinierpost

5

qmv

คำสั่งqmvจากrenameutilsเปิดเอดิเตอร์ที่แสดงรายการชื่อไฟล์ที่มีสอง colums คั่นด้วยแท็บ แต่ละแถวแสดงหนึ่งในชื่อไฟล์เหมือนกันในทั้งสองคอลัมน์ คอลัมน์ด้านขวาแสดงถึงชื่อใหม่ของไฟล์
หากต้องการเปลี่ยนแปลงแก้ไขชื่อทางด้านขวา ในตัวอย่างนี้:%s/...หรือโหมดบล็อกภาพมีประโยชน์

ชื่อไฟล์ในโปรแกรมแก้ไขของคุณ

$ qmv *.png

ในบรรณาธิการ:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

แก้ไขชื่อในคอลัมน์ด้านขวา:
(การลบimageคำนำหน้าจากบรรทัดทั้งหมดโดยใช้โหมดบล็อกภาพ)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

บันทึกการเปลี่ยนชื่อ:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(เช่น Ubuntu: apt-get install renameutils)


3

recursive

เรียกคืนไฟล์รูปภาพ * png ที่เลือกง่ายและไม่จำเป็นต้องจัดการกับบรรทัดใหม่ในชื่อไฟล์

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

ปลอดภัยสามารถจัดการกับช่องว่างบรรทัดใหม่แบ็กสแลชและสิ่งอื่น ๆ :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done

1

POSIX ใช้ sh ในขณะที่

กำลังอ่านชื่อจากfindคำสั่ง

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

อ่านชื่อจากไฟล์

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


1

สำหรับWindows และ linux สคริปต์ Perlนี้จะทำ ในกรณีนี้:

$ rnm -l 's/^image//' '*.png'

สคริปต์สามารถเรียกใช้ซ้ำภายใต้ไดเรกทอรีและยังเตรียมนับให้กับพวกเขาทั้งหมด:

$ rnm -r 's/^/$counter./' '/\.png$/'

UTF-8 chars จะได้รับการปฏิบัติอย่างถูกต้องทั้งใน Windows และ linux


0

คุณสามารถใช้เครื่องมือนี้: rnm ( เว็บเพจ )

สำหรับกรณีของคุณคำสั่งจะเป็น:

rnm -rs '/^image//' *.png

คุณสามารถค้นหาตัวอย่างเพิ่มเติม / เอกสารที่นี่


0

ลองใช้ brename ( https://github.com/shenwei356/brename ) ซึ่งเป็นเครื่องมือบรรทัดคำสั่งข้ามแพลตฟอร์มที่ใช้งานได้จริงสำหรับการเปลี่ยนแบตช์ไฟล์ / ไดเรกทอรีอย่างปลอดภัยผ่านนิพจน์ทั่วไป (รองรับ Windows, Linux และ OS X)

@patrickDurusauกล่าวว่า:

ลินุกซ์มีตัวเลือกการเปลี่ยนชื่อไฟล์แบทช์หลากหลาย แต่ฉันไม่เห็นชื่อเล่นสั้น ๆ ในชื่อที่ข้ามมาที่ฉัน

คุณสมบัติ:

  • ข้ามแพลตฟอร์ม รองรับ Windows, Mac OS X และ Linux
  • ปลอดภัย โดยการตรวจสอบความขัดแย้งและข้อผิดพลาดที่อาจเกิดขึ้น
  • กรองไฟล์ รองรับการรวมและไม่รวมไฟล์ผ่านการแสดงออกปกติ find ./ -name "*.html" -exec CMDไม่จำเป็นต้องใช้คำสั่งเช่น
  • การเปลี่ยนชื่อ submatch กับค่าที่สอดคล้องกันผ่านทางไฟล์ที่สำคัญที่มีมูลค่า
  • การเปลี่ยนชื่อผ่านจำนวนเต็มจากน้อยไปมาก
  • เปลี่ยนชื่อซ้ำทั้งไฟล์และไดเรกทอรีซ้ำ
  • สนับสนุนแห้ง
  • การส่งออกที่มีสีสัน

คำสั่ง:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed

-5

ls * png | ในขณะที่อ่าน -rf; ทำ f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; เสร็จแล้ว


มีบางอย่างไม่ถูกต้อง: "mv: ไม่มีตัวถูกดำเนินการปลายทางไฟล์หลังจาก 'image0001.png'"
ชายอินเทอร์เน็ต

3
รหัสของคุณมีปัญหามากมาย การแยกวิเคราะห์ผลลัพธ์ของการlsเรียกใช้เป็นเพียงปัญหา ควรจะเป็นread read -rการแทนที่ตัวแปรทั้งหมดควรอยู่ในเครื่องหมายคำพูดคู่
Gilles

for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; doneคุณสามารถเขียนได้อย่างมีประสิทธิภาพมากขึ้นเป็น แยกlsเป็นค่าที่จำเป็นหรือความคิดที่ดี
kojiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.