ไฟล์ mv ที่มีหลาย `. 'ในชื่อไฟล์


1

ฉันมีไฟล์บางไฟล์ที่ฉันได้รับพร้อมชื่อเช่น (สำหรับหลาย ๆ คนที่ต้องทำด้วยตนเองทุกวัน):

AA.B.txt
WW.C.txt

และฉันต้องการเปลี่ยนชื่อพวกเขาเป็นAA_B.txtและWW_C.txtเพื่อให้รหัส SQL ที่มีอยู่ยังคงทำงานตามที่คาดไว้ ตอนนี้ไฟล์เหล่านี้จะถูกละเว้นเนื่องจากรูปแบบ filename.letter.txt

ls ใช้งานได้และแสดงไฟล์เหล่านี้ให้ฉัน:

$ ls -a *.*.txt
AA.B.txt*
ABR.A.txt*
ABR.B.txt*
ABR.C.txt*
ACT.A.txt*

อย่างไรก็ตามmvคำสั่งที่คล้ายกันล้มเหลว:

$ mv *.*.txt *_*.txt
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

ฉันจะจับคู่รูปแบบที่ฉันมีกับสิ่งที่ฉันต้องการได้อย่างไร


หมายเหตุ: ในส่วนพฤติกรรมเช่นใน; ส่วนหนึ่งในการทำงานเช่น ไม่มีการเชื่อมต่อแบบโลจิคัลระหว่างเครื่องหมายดอกจันแรกและอันที่สามหรือระหว่างสองและสี่ mv *.*.txt *_*.txt*.*.txtecho *.*.txt*_*.txtecho *_*.txt
Kamil Maciorowski

คำตอบ:


2

mv ไม่ใช่เครื่องมือที่เหมาะสม

คุณควรใช้renameคำสั่ง:

rename 's/\./_/' *.*.txt

สตริง's/\./_/'หมายถึง "แทนที่การเกิดขึ้นครั้งแรกของ a .ด้วย a _ในรายการไฟล์ folling"


โอ้ ฉันไม่รู้เกี่ยวกับคำสั่งเปลี่ยนชื่อ ดีมาก.
Lewis M

ว้าว. ติดตั้งแล้วrenameและทำงานได้อย่างสมบูรณ์ man renameตอนนี้ที่จะอ่าน ขอบคุณมาก.
เจสัน

2

คำสั่ง mv สามารถมีหนึ่งเป้าหมายเท่านั้นไม่ว่าจะเป็นการเปลี่ยนชื่อไฟล์หนึ่งไฟล์ (เช่น mv AA.B.txt AA_B.txt) หรือย้ายชุดของไฟล์และไดเรกทอรีไปยังไดเรกทอรี (เช่น mv . .txt newdir ) หากคุณต้องการเปลี่ยนชื่อไฟล์คุณต้องทำทีละไฟล์ ดังนั้นการวนรอบบางอย่าง

ลองทำสิ่งต่อไปนี้:

for f in *.*.txt; do
    mv ${f} $(echo ${f} | sed -e 's#\.#_#')
done

คำสั่ง sed แทนที่จุดแรกที่พบด้วยเครื่องหมายขีดล่าง จุดที่เหลืออยู่จะไม่ถูกแตะต้อง

หวังว่านี่จะช่วยได้

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