ฉันจะเปลี่ยนชื่อไฟล์หลาย ๆ ไฟล์ได้อย่างง่ายดายโดยใช้บรรทัดคำสั่งได้อย่างไร


103

อีกวิธีหนึ่งที่ฉันเปลี่ยนชื่อไฟล์อย่างรวดเร็วใน Windows คือ

F2 > Rename > Tab (to next file) > Rename ...

แต่ใน Ubuntu / Nautilus ฉันไม่สามารถแท็บไฟล์ถัดไปได้ แต่เมื่ออยู่บน Linux ฉันคิดว่าต้องมีทางเลือกบรรทัดคำสั่ง

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


1
คุณช่วยนิยาม "การควบคุมเพิ่มเติม" ได้ไหม? ไม่แน่ใจว่าสิ่งที่คุณขอว่า ..
Dang Khoa

ฉันคิดว่าคำถามนี้ไม่ได้รับคำตอบ สิ่งที่คุณขอ (F2 แล้วกระโดดในโหมด F2 ไปยังไฟล์ถัดไป) ไม่สามารถใช้งานได้ในขณะนี้ฉันคิดว่าใน Nautilus
don.joey

คำตอบ:


187

ฉันใช้renameตลอดเวลา มันค่อนข้างง่าย แต่หวังว่าคุณจะรู้พื้นฐานของ regex:

rename "s/SEARCH/REPLACE/g"  *

สิ่งนี้จะแทนที่สตริงSEARCHด้วยREPLACEในทุกไฟล์ (นั่นคือ*) /gหมายถึงทั่วโลกดังนั้นหากคุณมีก็จะถูกเปลี่ยนชื่อเป็นSEARCH_SEARCH.jpg REPLACE_REPLACE.jpgหากคุณไม่ได้มีก็จะได้ทำเฉพาะเปลี่ยนตัวครั้งและทำให้ตอนนี้ชื่อ/g REPLACE_SEARCH.jpgหากคุณต้องการตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ให้เพิ่ม/i(นั่นคือ/giหรือ/igในตอนท้าย)

ด้วยการแสดงออกปกติคุณสามารถทำอะไรได้อีกมากมาย

โปรดทราบว่านี่renameคือคำสั่งprename(aka Perl rename) ซึ่งรองรับนิพจน์ปกติของ Perl ที่สมบูรณ์ มีอีกอย่างหนึ่งrenameที่ใช้รูปแบบและไม่มีประสิทธิภาพ prenameเคยติดตั้งโดยค่าเริ่มต้นบน Ubuntu (พร้อมด้วย Perl) แต่ตอนนี้คุณอาจต้องทำ:

sudo apt install rename

นี่คือตัวอย่างบางส่วน:

อุปสรรค

เพิ่ม :

rename 's/^/MyPrefix_/' * 
  • document.pdf เปลี่ยนชื่อเป็น MyPrefix_document.pdf

ลบ :

นอกจากนี้คุณสามารถลบสตริงที่ไม่พึงประสงค์ สมมติว่าคุณมีไฟล์ MP3 20 ไฟล์ชื่อที่ต้องการCD RIP 01 Song.mp3และคุณต้องการที่จะลบส่วน "CD RIP" และคุณต้องการที่จะลบมันออกจากไฟล์ทั้งหมดด้วยคำสั่งเดียว

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 ไปยัง 01 Song.mp3

สังเกตุช่องว่างเพิ่มเติม'^CD RIP 'โดยไม่ต้องเว้นวรรคไฟล์ทั้งหมดจะมีช่องว่างเป็นอักขระตัวแรกของไฟล์ นอกจากนี้โปรดทราบว่าวิธีนี้จะทำงานได้โดยไม่มี^อักขระ แต่จะจับคู่กับCD RIP ส่วนใด ๆ ของชื่อไฟล์ การ^รับประกันจะลบเฉพาะอักขระหากเป็นจุดเริ่มต้นของไฟล์

การจำแนก

เพิ่ม :

rename 's/$/_MySuffix/' *
  • document.pdf เปลี่ยนชื่อเป็น document.pdf_MySuffix

เปลี่ยน :

rename 's/\.pdf$/.doc/' *

จะเปลี่ยนเข้าสู่Something.pdf Something.doc(เหตุผลสำหรับแบ็กสแลชคือ.คืออักขระ wildcard ใน regexp ดังนั้น.pdfจับคู่qPDFในขณะที่\.pdfตรงกับสตริงที่แน่นอน.pdfเท่านั้นนอกจากนี้สิ่งสำคัญที่ควรทราบถ้าคุณไม่คุ้นเคยกับ BASH คุณต้องใส่แบ็กสแลชในเครื่องหมายอัญประกาศเดี่ยว! หรือใช้อัญประกาศคู่หรือทุบตีจะพยายามแปลพวกเขาเพื่อทุบตี\. และ "\."เท่ากับ.(แต่ใช้เครื่องหมายอัญประกาศคู่และแบ็กสแลชตัวอย่างเช่น "\ n" สำหรับการขึ้นบรรทัดใหม่ แต่เนื่องจาก"\."ลำดับการหลบหนีกลับไม่ถูกต้อง แปลเป็น.)

ที่จริงแล้วคุณยังสามารถแนบชิ้นส่วนของสตริงในเครื่องหมายคำพูดแทนของทั้งนี้'s/Search/Replace/g'เป็นเช่นเดียวกับs/'Search'/'Replace'/gและs/Search/Replace/gการทุบตี คุณเพียงแค่ต้องระมัดระวังเกี่ยวกับอักขระพิเศษ (และช่องว่าง)


ฉันขอแนะนำให้ใช้-nตัวเลือกเมื่อคุณไม่แน่ใจคุณมีการแสดงออกปกติที่ถูกต้อง มันแสดงให้เห็นถึงสิ่งที่จะถูกเปลี่ยนชื่อจากนั้นออกโดยไม่ทำมัน ตัวอย่างเช่น:

rename -n s/'One'/'Two'/g *

นี่จะแสดงรายการการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นหากคุณไม่ได้ตั้ง-nค่าสถานะไว้ที่นี่ หากดูดีให้กดUpเพื่อย้อนกลับจากนั้นลบ-nและกดEnter(หรือแทนที่ด้วย-vเพื่อส่งออกการเปลี่ยนแปลงทั้งหมดที่ทำ)

หมายเหตุ : อูบุนตูเวอร์ชันด้านบน 17.04 ไม่ได้จัดส่งrenameตามค่าเริ่มต้นอย่างไรก็ตามยังมีให้บริการในที่เก็บข้อมูล ใช้sudo apt install renameสำหรับติดตั้ง


ฉันจะมีคำต่อท้าย "แบบไดนามิก" ได้อย่างไร เช่น 001 - 010 เป็นต้นเป็นไปได้ไหม
Jiew Meng

อืม .. ฉันพยายามเขียนบางอย่าง แต่มันใช้งานไม่ได้ ส่วนใหญ่เป็นเพราะเมื่อฉันเพิ่ม 1 ถึง 001 มันเพิ่มเป็น 2 ไม่ใช่ 002 มิฉะนั้นฉันสามารถใช้ varaibles เพื่อคงตำแหน่งตัวเลขจากนั้นจึงต่อท้าย นอกจากนี้ฉันเพิ่งจำได้ก่อนที่ฉันจะรู้เกี่ยวกับrenamecommmand นี่คือสิ่งที่ฉันได้ต่อท้าย:for f in *; do mv -v "$f" "prependThis$f"; done
แมตต์

2
@jiewmeng ใช่ ใช้(?:\.[0-9]{3})$ในรูปแบบของคุณมันจะตรงกับนามสกุลไฟล์ 3 หลักทั้งหมดในกลุ่มแบบพาสซีฟ ตัวอย่าง: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. ดูที่สูตรโกง regexนี้
sergio91pt

@ sergio91pt มันเป็นสูตรโกง regex ที่ดี แต่มันเกี่ยวกับอะไร ต้องเป็น Perl - แต่ไม่พบบันทึกย่อดังกล่าวที่นั่น
Adobe

@Adobe มันเป็นหนึ่งทั่วไปสำหรับ "Perl ตาม regex" ดูหมายเหตุเกี่ยวกับเครื่องหมาย + และคอลัมน์เกี่ยวกับ POSIX Character Classes
sergio91pt

21

ลองpyrenamer

มันไม่ได้รวมเข้ากับหอยโข่ง แต่ทำงานให้เสร็จ นี่คือความคิดเห็น

Thunar (ส่วนหนึ่งของ XFCE) มีตัวเปลี่ยนชื่อที่คุณสามารถเรียกใช้แยกกันได้

เปลี่ยนชื่อกลุ่ม Thunar


2
ขอบคุณที่พูดถึงฟังก์ชั่น Thunar หากคุณมี Thunar - เลือกไฟล์ในโฟลเดอร์และกด F2
สูงสุด

9

ดูเหมือนว่าจะมีโครงการที่เรียกว่า Launchpad หอยโข่ง-เปลี่ยนชื่อ คุณสามารถติดตั้งได้โดยเรียกใช้make installเมื่อคุณดาวน์โหลดสคริปต์และปลดล็อคมัน ดูเหมือนว่าจะมีฟังก์ชั่นบางอย่างหรือหากคุณรู้ว่าการเขียนโปรแกรมบางอย่างอาจเป็นไปได้ที่คุณจะสามารถปรับปรุงให้เหมาะกับความต้องการของคุณเนื่องจากเป็นเพียงสคริปต์ไพ ธ อน

ป้อนคำอธิบายรูปภาพที่นี่


8

ในบรรทัดคำสั่งเพื่อเปลี่ยนชื่อไฟล์เดียวคำสั่งเป็นเพียง

mv file1.txt file2.txt

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

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

ขึ้นอยู่กับว่าคุณต้องการสิ่งต่าง ๆ ที่ถูกเปลี่ยนชื่ออย่างไรน่าจะเป็น tweaked ตัวอย่างเช่นถ้าคุณมีกฎการเปลี่ยนชื่อที่เฉพาะเจาะจงที่จะปฏิบัติตาม (โดยส่วนตัวแล้วฉันจะทำสิ่งนี้ผ่านสคริปต์ Perl เนื่องจาก bash-foo ของฉันไม่ค่อยดีนัก แต่นั่นเป็นเพียงฉัน)

โปรดทราบว่าผมได้รับการแยกของชื่อไฟล์และส่วนขยายจากคำถามที่ถามก่อนหน้านี้


7

ในกรณีที่คุณต้องการที่จะทำมันไม่บรรทัดคำสั่งคล้าย ๆ กับสิ่งที่คุณได้รับการทำใน Windows ใช้ปุ่มลูกศรขวาแทนคีย์แท็บ นี่จะเลือกไฟล์ถัดไปเช่นเดียวกับที่แท็บทำใน Windows


ไม่เหมือนกัน: คุณยังคงต้องป้อน ENTER เพื่อเสร็จสิ้นการเปลี่ยนชื่อปุ่มลูกศรเพื่อย้ายไปยังไฟล์ถัดไปและ F2 เพื่อเปลี่ยนชื่อ TAB ทำใน 1 ขั้นตอนเมื่อคุณเปลี่ยนชื่อไฟล์
MestreLion

@MestreLion แต่มันคล้ายกับอัลกอริทึมที่อธิบายไว้ในคำถามและไม่จำเป็นต้องใช้ซอฟต์แวร์เพิ่มเติมใด ๆ หรือการทำงานของบรรทัดคำสั่ง ประเภทของการใช้งานง่าย
RafałCieślak

จริงคุณเป็นคำตอบเดียวที่อย่างน้อยก็ลองใช้วิธีเดียวกันกับคำถามเดิม และความจริงที่น่าเศร้าก็คือ Nautilus นั้นไม่มีฟังก์ชั่นดังกล่าว คุณสามารถ F2 เพื่อเปลี่ยนชื่อ แต่นั่นมัน ไม่มีแท็บที่จะข้ามคุณไปยังไฟล์ถัดไปโดยอัตโนมัติในโหมดเปลี่ยนชื่อแล้ว
MestreLion

7

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

qmv เป็นเครื่องมือที่มีประโยชน์จากแพ็คเกจ renameutils มันช่วยให้คุณสามารถใช้โปรแกรมแก้ไขข้อความที่คุณชื่นชอบเพื่อเปลี่ยนชื่อไฟล์ เมื่อรวมเข้ากับพลังของเสียงเรียกเข้าแล้วคุณจะได้รับประโยชน์การเปลี่ยนชื่อที่ยอดเยี่ยม

ฉันมักจะเรียกมันเหมือนqmv -f doใน dir ที่ฉันต้องการเปลี่ยนชื่อไฟล์เป็นจำนวนมาก qmv -R -f doหรือถ้าเราต้องการที่จะเปลี่ยนชื่อซ้ำ

เมื่อใดก็ตามที่ฉันจำเป็นต้องเปลี่ยนชื่อไฟล์หลายไฟล์ฉันมักจะย้อนกลับไปที่ qmv (และเป็นกลุ่ม)

http://www.nongnu.org/renameutils/


ฉันแค่ลองทำตามคำแนะนำของคุณ นี่เป็นเครื่องมือที่ยอดเยี่ยมที่สุดถ้าคุณใช้เสียงเรียกเข้า!
ste_kwr

3

หากตัวเลือกที่เหมาะสมเท่านั้นที่จะเปลี่ยนชื่อไฟล์ด้วยตนเองเป็นวิธีที่ดีในการใช้vidir(ในmoreutilsแพ็คเกจ):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

ตัวอย่าง


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

เนื้อหาของไดเรกทอรีทำงานปัจจุบัน:

.
├── bar
├── baz
└── foo

เรียกใช้vidirเปลี่ยนชื่อไฟล์ในบรรทัดที่มีชื่อไฟล์ที่คุณต้องการเปลี่ยนชื่อ กดCTRL+ OและCTRL+ X:

screenshot3

.
├── bar.bak
├── baz.old
└── foo.new

สลับชื่อไฟล์อย่างเลือก

เนื้อหาของไดเรกทอรีทำงานปัจจุบัน:

.
├── bar
├── baz
└── foo

เนื้อหาไฟล์ของไดเรกทอรีทำงานปัจจุบัน:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

เรียกใช้vidirสลับตัวเลขในบรรทัดที่มีชื่อไฟล์ที่คุณต้องการสลับ กดCTRL+ OและCTRL+ X:

screenshot4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

การลบไฟล์แบบเลือก

เนื้อหาของไดเรกทอรีทำงานปัจจุบัน:

.
├── bar
├── baz
└── foo

เรียกใช้vidirลบบรรทัดที่มีไฟล์ที่คุณต้องการลบ กดCTRL+ OและCTRL+ X:

screenshot2

.
└── baz

2

ฉันใช้ krename มันเป็นแอพ GUI มันสามารถอ่านแท็ก mp3 และอื่น ๆ

มันมีอยู่เป็นแอพแยกต่างหากและเป็นส่วนหนึ่งของ Krusader

นอกจากนี้ยังมีrenameสคริปต์ - ซึ่งเป็นส่วนหนึ่งของการติดตั้ง Perl มาตรฐาน (คุณอาจติดตั้งไว้แล้ว) man renameตรวจสอบมันออกด้วย

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