เปลี่ยนชื่อไฟล์โดยการเพิ่มตัวเลขภายในชื่อไฟล์


14

ฉันมีไดเรกทอรีซึ่งมีไฟล์รูปภาพที่กำหนดหมายเลขไว้ดังนี้:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

บางครั้งอาจมีไฟล์หลายเวอร์ชันในรูปแบบที่แตกต่างกัน (เช่น a pngและsvgเวอร์ชันของ03และ09ไฟล์ด้านบน) แต่ตัวเลขจะเรียงกันเป็นอย่างอื่น โดยทั่วไปจะมีไฟล์ดังกล่าว 40-80 ไฟล์ในแต่ละไดเรกทอรี ตัวเลขสอดคล้องกับลำดับภาพเหล่านี้ปรากฏในต้นฉบับ (เอกสาร Word แต่นั่นไม่สำคัญ) ไม่มีวิธีอื่นในการกำหนดลำดับของภาพ

ถ้าฉันเพิ่มรูปภาพใหม่ลงในต้นฉบับฉันต้องวางสำเนาของรูปภาพในไดเรกทอรีนี้ด้วยหมายเลขที่ถูกต้อง ดังนั้นหากภาพใหม่เป็นภาพที่ห้าในต้นฉบับฉันจำเป็นต้องเปลี่ยนชื่อไฟล์ในไดเรกทอรีเป็นสิ่งนี้เพื่อให้มีที่ว่างสำหรับมัน:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

อะไรคือวิธีที่ตรงไปตรงมาที่สุดจากบรรทัดคำสั่งหรือจากสคริปต์หรือแมโครเพื่อกำหนดหมายเลขไฟล์ใหม่ทั้งหมดที่เริ่มต้นด้วยจำนวนที่แน่นอน ฉันมีการติดตั้ง Fedora Linux แบบมาตรฐานโดยใช้ bash

คำตอบ:


11

ฉันคิดว่ามันควรจะทำงาน:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

สคริปต์รับหนึ่งพารามิเตอร์ - จำนวนภาพใหม่ของคุณ

PS ใส่สคริปต์ในไดเรกทอรีอื่นนอกเหนือจากภาพของคุณ ในไดเรกทอรีรูปภาพควรมีเฉพาะภาพที่มีชื่อในแบบที่คุณอธิบายนี้


ดูเหมือนว่าจะมีแนวโน้มฉันจะลองใช้ในสองสามชั่วโมงเมื่อฉันกลับมาใช้แล็ปท็อป
robertc

จะใช้งานได้หากชื่อไฟล์ของคุณไม่ได้ขึ้นต้นด้วยตัวอักษรที่ไม่ใช่ตัวเลข
mems

@mems OP ระบุชัดเจนว่าชื่อไฟล์ขึ้นต้นด้วยตัวเลข
xhienne

2

มันจะง่ายกว่าใน zsh ที่คุณสามารถใช้ได้

  • ตัวระบุแบบOn กลมเพื่อเรียงลำดับการจับคู่ที่ลดลง (และnใช้ลำดับตัวเลขในกรณีที่ชื่อไฟล์ไม่ได้มีเลขศูนย์นำหน้าด้วยความกว้างเท่ากัน);
  • (l:WIDTH::FILLER:) ธงขยายตัวพารามิเตอร์แผ่นตัวเลขทั้งหมดให้มีความกว้างเดียวกัน (ความกว้างของจำนวนขนาดใหญ่)
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

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

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

ปัญหานี้แน่นอนจะครอบคลุมในบทความนี้ โปรดทราบว่าคุณจะต้องแก้ไขเพื่อรองรับรูปแบบ SVG และ PNG โดยเพิ่มขั้นตอน MV ที่สอง


ฉันไม่คิดว่ามันเป็นปัญหาที่แน่นอนที่จะจัดลำดับรูปภาพใหม่ทุกครั้ง ฉันแค่ต้องการจัดรูปใหม่จากจุดเฉพาะ
robertc

1

ง่ายขึ้น:

touch file`ls file* | wc -l`.ext

คุณจะได้รับ:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

ฉันจะเพิ่มศูนย์นำหน้าสำหรับ 1-9 ได้อย่างไร โปรดจำไว้ว่าอาจมีไฟล์สองไฟล์ 03.png และ 03.svg
robertc

1

ดูเหมือนจะไม่มีความสนใจในคำถามนี้มากนัก แต่หากใครบางคนสะดุดมันมีสามประเด็นที่นี่ วิธีหนึ่งคือการเลือกไฟล์ที่จะเปลี่ยนชื่อตามเกณฑ์ความหมาย (ช่วงไม่ศัพท์และไม่สามารถระบุได้โดย wildcard หรือแม้แต่การแสดงออกปกติ - ทฤษฎีออโตมาตะบอกว่าสิ่งนี้ซับซ้อนกว่า NFA) ประการที่สองคือวิธีการเปลี่ยนชื่อโดยการแก้ไขส่วนหนึ่งของมัน ที่สามคือวิธีการหลีกเลี่ยงการชนชื่อ สคริปต์ใน Bash และภาษาอื่น ๆ สามารถทำการแปลงเฉพาะนี้ได้ แต่พวกเราส่วนใหญ่คงไม่ต้องเขียนโปรแกรมทุกครั้งที่เราต้องการเปลี่ยนชื่อไฟล์เป็นจำนวนมาก ด้วย rene.py ของฉัน (ฟรีและโอเพนซอร์ส) คุณสามารถทำสิ่งที่คุณต้องการได้ แต่ต้องใช้การเรียกใช้สองครั้งเพื่อหลีกเลี่ยงปัญหาการชนกันของชื่อ เป็นครั้งแรกrene ?.*/#7-80 %?.* Bเพิ่มชื่อทั้งหมดในช่วงโดยเพิ่มคำนำหน้าเป็น% เพื่อหลีกเลี่ยงชื่อที่มีอยู่ จากนั้นrene %* *ลบคำนำหน้านี้ออกจากไฟล์ที่มี ฉันอธิบายสิ่งนี้ที่https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

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