เปลี่ยนชื่อไฟล์ที่ขึ้นต้นด้วยตัวเลขเป็นสองหลัก [ซ้ำกัน]

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

    #!/bin/bash 
    if [ ! -d mp3 ]; then
    mkdir -p mp3;
    fi;
    for f in ./*.flac; do echo "file '$f'" >> mylist.txt; done
    ffmpeg -f concat -safe 0 -i mylist.txt -b:a 320k mp3/title.mp3
    [ -e mylist.txt ] && rm mylist.txt

ปัญหาของฉันคือฉันต้องเปลี่ยนชื่อไฟล์สิบไฟล์แรกเนื่องจากไฟล์เหล่านั้นไม่อยู่ในลำดับที่ถูกต้อง ไฟล์มีชื่อว่า 1 - ชื่อเรื่อง, 2 - ชื่อเรื่อง, 3 - ชื่อเรื่องและอื่น ๆ เพื่อให้ได้ลำดับที่ถูกต้อง ฉันต้องเปลี่ยนชื่อเป็น 01 - หัวเรื่อง, 02 - หัวเรื่อง, ..., 09 - หัวเรื่อง ฉันจะทำสิ่งนั้นด้วย bash script ได้อย่างไร? นอกจากนี้ คงจะดีไม่น้อยหากไฟล์ Playlist.m3u มีการเปลี่ยนแปลงตามนั้น

ขอบคุณสำหรับความช่วยเหลือของคุณ.

@Cyrus โพสต์ลิงก์ที่ถูกต้องเพื่อแก้ไขปัญหาของฉัน สคริปต์ที่แก้ไขแล้วคือ:

#!/bin/bash
if [ ! -d mp3 ]; then
mkdir -p mp3;
fi;
for f in ./*.flac; do echo "file '$f'" >> mylist2.txt; done
sort -V mylist2.txt >> mylist.txt
rm mylist2.txt
ffmpeg -f concat -safe 0 -i mylist.txt -b:a 320k mp3/title.mp3
[ -e mylist.txt ] && rm mylist.txt

person Flavorum1    schedule 09.09.2018    source แหล่งที่มา
comment
วิธีนี้อาจช่วยได้: การเรียงลำดับสตริงด้วยตัวเลขใน Bash   -  person Cyrus    schedule 09.09.2018
comment
ขอบคุณ ฉันเปลี่ยนสคริปต์ 'for f in ./*.flac; ทำไฟล์เสียงสะท้อน '$f' ›› mylist2.txt; เรียงลำดับเสร็จแล้ว -V mylist2.txt ›› mylist.txt rm mylist2.txt'   -  person Flavorum1    schedule 09.09.2018


คำตอบ (1)


คุณสามารถใช้ sort -n สำหรับสิ่งนี้ ฉันทำอย่างนี้:

~/SO $ l
total 8
-rw-rw-r-- 1 user user    0 Sep  9 14:49 12 - Title
-rw-rw-r-- 1 user user    0 Sep  9 14:49 1 - Title
-rw-rw-r-- 1 user user    0 Sep  9 14:49 22 - Title
-rw-rw-r-- 1 user user    0 Sep  9 14:49 2 - Title

~/SO $ ls | sort -n
1 - Title
2 - Title
12 - Title
22 - Title

เพียงเพื่อแสดงให้คุณเห็นว่าฉันไม่ได้ "โกง" นี่คือนามแฝง:

alias l='ls -lp'
alias ls='ls --color=auto'

ดังนั้นคุณสามารถใช้:

ls | sort -n | while read file
do
    echo $file
done

เสียงสะท้อนที่นี่เป็นเพียงการแสดงให้เห็นว่าลำดับของไฟล์ที่ประมวลผลนั้นเคารพค่าตัวเลข

person Nic3500    schedule 09.09.2018
comment
ขอขอบคุณสำหรับความช่วยเหลือของคุณ. ฉันใช้ sort -n เพื่อแก้ไขปัญหาของฉัน - person Flavorum1; 09.09.2018
comment
สิ่งสำคัญคือต้องทราบว่าตัวแปรนี้ใช้ได้กับชื่อไฟล์ที่ไม่มีช่องว่างหรือตัวแบ่งบรรทัดเท่านั้น - person Cyrus; 09.09.2018
comment
ไม่ ฉันทำมันโดยใช้ชื่อไฟล์ที่มีช่องว่าง - person Nic3500; 09.09.2018
comment
@ Flavorum1: ถ้ามันแก้ปัญหาของคุณได้ คุณสามารถยอมรับคำตอบโดยมีเครื่องหมายถูกทางด้านซ้ายของคำตอบ :-) - person Nic3500; 09.09.2018
comment
@ Nic3500: โปรดทดสอบ while read loop ด้วยไฟล์ของคุณ - person Cyrus; 09.09.2018
comment
ฉันทำสองครั้ง ก่อนที่ฉันจะโพสต์หลังจากที่คุณโพสต์ความคิดเห็น ฉันทำสิ่งนี้: touch "1 - title";touch "2 - title";touch "12 - title"; ls | sort -n | while read file; do echo "BEFORE${file}AFTER"; done และได้ไฟล์ที่จัดเรียงตามที่ OP ต้องการ Bash v4.3.48 ใน Mint 18 BEFORE และ AFTER เป็นเพียงเพื่อให้แน่ใจว่าฉันไม่ได้เพิ่มอะไรหรือข้ามบรรทัด - person Nic3500; 09.09.2018
comment
@cyrus: คุณสามารถโพสต์ลิงก์ไปยังโซลูชันของคุณเป็นคำตอบได้ Flavorum1: คุณสามารถยอมรับเวอร์ชันของ cyrus แทนเวอร์ชันของฉันได้ เมื่อโพสต์แล้ว - person Nic3500; 09.09.2018
comment
@ Nic3500: ไม่เป็นไร ขอโทษที ฉันทำการทดสอบผิดพลาดครั้งใหญ่ - person Cyrus; 09.09.2018
comment
@cyrus โพสต์ความคิดเห็น ดังนั้นฉันจึงไม่สามารถทำเครื่องหมายว่าเป็นวิธีแก้ปัญหาได้ ดูเหมือนว่าโซลูชันทั้งสองจะทำงานได้ - person Flavorum1; 09.09.2018
comment
วิธีแก้ปัญหาการทำงานของ @ Nic3500 คือ: 'ls | เรียงลำดับ -n | ในขณะที่อ่านไฟล์ ให้ทำ if [[ $file == *.flac ]]; จากนั้นไฟล์ echo '$file' ›› mylist2.txt; ฟี; เสร็จแล้ว' - person Flavorum1; 09.09.2018