การเปลี่ยนชื่อไฟล์หลายร้อยไฟล์พร้อมกันเพื่อการจัดเรียงที่เหมาะสม


23

ฉันมีตันของไฟล์ทุกสิ่งที่ชื่อเหมือน1.jpg, 2.jpg, 3.jpgและอื่น ๆ ขึ้นไป1439.jpgแต่ผมมีปัญหากับหนึ่งในโครงการของฉันและ alphabetizing มันมักจะไปในการสั่งซื้อ1.jpg, 10.jpg, 11.jpgและอื่น ๆ

สิ่งที่ฉันต้องการก็คือวิธีการตั้งชื่อไฟล์บางอย่างเพื่อให้พวกเขาอยู่ในรูปแบบที่หลากหลายเช่นทุกทางขึ้นไป00001.jpg01439.jpg

ฉันจะทำสิ่งนี้ได้อย่างรวดเร็วและมีประสิทธิภาพได้อย่างไร


สิ่งที่คุณกำลังมองหาคือ "การจัดเรียงตามธรรมชาติ" ซึ่งอาจช่วยได้: askubuntu.com/questions/41390/…
Fabian Blechschmidt

ตอบว่าไม่ใช่คำตอบโดยตรง? ls -v unix.stackexchange.com/questions/33909/…
WernerCD

+1 pyrenamerเพราะผมได้พยายามที่จะทำเช่นนี้ใน
Parto

@FabianBlechschmidt ฉันต้องการสิ่งนี้ในโปรแกรมที่ไม่ใช้กับ nautilus หรือที่คล้ายกัน มันมีไว้สำหรับแต่ละโครงการ
Kaz Wolfe

ฉันคิดว่าคุณคิดเกี่ยวกับการใช้การเรียงลำดับตามธรรมชาติ? แต่ผมเข้าใจเปลี่ยนชื่อไฟล์เป็นเรื่องง่ายมากและถ้ามันจะทำงานได้ดี :)
Fabian Blechschmidt

คำตอบ:


35

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

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

นี่คล้ายกับprintfคำตอบของรูปแบบอื่น ๆที่นี่ แต่มันก็ถูกจัดการทั้งหมดสำหรับเรา รหัสด้านบนใช้สำหรับตัวเลข 5 หลัก (รวมถึงหมายเลขตัวแปรของศูนย์นำหน้า)

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

หมายเหตุ: นี่ไม่ได้พกพาได้อย่างสมบูรณ์ การแจกแจงจำนวนมากใช้rename.ulจากutil-linuxแพ็คเกจเป็นrenameไบนารีเริ่มต้น นี่เป็นทางเลือกที่น่าสนใจอย่างมาก (ดูman rename.ul) ซึ่งไม่เข้าใจด้านบน หากคุณต้องการสิ่งนี้บนแพลตฟอร์มที่ไม่ได้ใช้การเปลี่ยนชื่อของ Perl ค้นหาวิธีการติดตั้งก่อน


และนี่คือสายรัดทดสอบ:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

และคำนำหน้าตัวอย่าง (เราไม่ได้ทำอะไรที่แตกต่าง):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

ถ้าฉันเป็นคน Perl นี่จะเป็นทางออกที่สมบูรณ์แบบ เรียบร้อยจริงๆ
MGP

2
มันไม่ได้ใช้ Perl ใด ๆ เพียงแค่เครื่องมือที่ให้มาซึ่งเขียนเป็นภาษา Perl แล้ว
Rob

1
ในกรณีนี้มันไม่เกี่ยวข้องกับคำสั่ง Perl เดียว แต่ก็ไม่ได้ว่าการยกของหนัก sprintfใน Perl ทำงานคล้ายกับsprintfในภาษาอื่น ๆ
Oli

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

แก้ไข

คำอธิบาย:

  • if [[ $f =~ [0-9]+\. ]] ตรวจสอบให้แน่ใจว่ามีการเปลี่ยนชื่อไฟล์ที่มีชื่อเป็นตัวเลขเท่านั้น (ตามด้วยจุด)
  • printf "%.5d" NUMBER เพิ่มศูนย์นำ
  • "${f%.*}" ตัดส่วนขยาย (.jpg) และปล่อยให้เป็นตัวเลข
  • .jpgหลังจาก backtick ที่สองเพิ่มนามสกุลไฟล์อีกครั้ง

โปรดทราบว่าจะใช้งานได้กับชื่อไฟล์ที่เป็นตัวเลขเท่านั้น การเว้นศูนย์นำหน้าไปยังไฟล์ที่ไม่มีหมายเลขจะต้องใช้รูปแบบที่แตกต่างกัน

หากคุณต้องการทดลองลองใช้คำสั่งนี้:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

แก้ไข 2

ทำให้คำสั่งนั้นปลอดภัยยิ่งขึ้นด้วยการทำให้แน่ใจว่าเฉพาะชื่อไฟล์ที่เป็นตัวเลขเท่านั้นที่จะถูกเปลี่ยนชื่อ โปรดทราบว่าไฟล์ใด ๆ ที่มีอยู่ก่อนเช่น 00001.jpg จะถูกเขียนทับ


สคริปต์ซับในตัวนี้ใช้งานได้นอกกรอบบน Ubuntu และ Linux distros อื่น ๆ ! 😃ไม่จำเป็นต้องติดตั้งเครื่องมือเพิ่มเติมใด ๆ โดยใช้ Perl, Python และอื่น ๆ
HEXcube

6

ด้านล่างสคริปต์หลาม

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

การรวมส่วนขยายที่แตกต่างกันในการเปลี่ยนชื่อหนึ่งครั้งอาจช่วยเพิ่มความสะดวกสบายได้ เพื่อเพิ่มส่วนขยาย (s), เพียงแค่เพิ่มให้ tuple extensions = (".jpg", ".jpeg", ".tiff")เช่น

คัดลอกข้อความไปยังไฟล์เปล่าบันทึกเป็นrename.pyป้อนเส้นทางที่ถูกต้องไปยังไดเรกทอรีไฟล์ ( sourcedir) จำนวนหลักที่คุณต้องการให้ชื่อใหม่มี ( number_ofdigits) และนามสกุลไฟล์เพื่อเปลี่ยนชื่อ ( extensions)

เรียกใช้โดยคำสั่ง:

python3 /path/to/script/rename.py

บท:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

แก้ไข:

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

ตัวอย่าง:

1.jpg
12.jpg
123.jpg

กลายเป็น:

001.jpg
012.jpg
123.jpg

ไม่จำเป็นต้องกำหนดจำนวนหลัก

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

มียูทิลิตี้เปลี่ยนชื่อที่ใช้งานใน Perl ซึ่งทำให้ง่ายมาก:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

อาร์กิวเมนต์แรกคือนิพจน์ Perl ที่ประเมินสำหรับชื่อไฟล์แต่ละชื่อ


0

มี GUI ที่จะทำสิ่งนี้เรียกว่า pyRenamer ซึ่งสามารถพบได้ในที่เก็บ ติดตั้งเริ่มเลือกไดเรกทอรีของคุณและตั้งค่า 'รูปแบบชื่อไฟล์ที่เปลี่ยนชื่อ' เป็น '{num5}' บนแท็บ 'รูปแบบ' และคลิกปุ่ม 'เปลี่ยนชื่อ' คุณสามารถดูตัวอย่างว่าจะเกิดอะไรขึ้นก่อนที่จะเปลี่ยนชื่อ


ในขณะที่คำตอบของคุณใช้งานได้โปรดทราบว่านี่เป็นshell-scriptingส่วนหนึ่งซึ่งหมายถึงฉันกำลังมองหาคำตอบ commandline นอกจากนี้คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับโปรแกรมได้หรือไม่ ตัวอย่างเช่นรูปแบบของรูปแบบคือ{num5}อะไร
Kaz Wolfe

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

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

ปรับปรุง: คุณมีคำตอบที่สมบูรณ์มากขึ้น


2
มันเปลี่ยนชื่อ 1439.jpg เป็น 0001439.jpg
Avinash Raj

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