Linux - การแทนที่ช่องว่างในชื่อไฟล์


97

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

คำตอบ:


178

สิ่งนี้ควรทำ:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

สิ่งนี้ไม่ได้ผลสำหรับฉัน มีการอ้างสิทธิ์ไฟล์ที่เหมือนกัน (มีชื่อไฟล์ไม่ถูกต้อง) เช่นพยายามที่จะเปลี่ยนชื่อ1 - foo.jpgและโฟลเดอร์ของฉันมีอยู่แล้ว1.jpgในนั้น
โดย

4
ฉันพบว่า backticks อ่านยากเมื่ออยู่ใกล้เครื่องหมายคำพูด เหมือนกัน แต่อ่านได้มากกว่าfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

หมายเหตุ: เรียกใช้จาก WITHIN ไดเร็กทอรีที่มีชื่อไฟล์ที่คุณต้องการอัปเดต หรือคุณสามารถเปลี่ยนไป* PATH_TO_YOUR_DIRECTORY
CFitz

75

ฉันชอบใช้คำสั่ง 'เปลี่ยนชื่อ' ซึ่งใช้ regexes สไตล์ Perl:

rename "s/ /_/g" *

คุณสามารถวิ่งแบบแห้งได้ด้วยแฟล็ก -n:

rename -n "s/ /_/g" *

3
สิ่งนี้จะใช้งานได้ถ้าคุณเปลี่ยนชื่อแบบ perl และไม่ใช่ redhat / fedora ที่ง่ายกว่า
David Dean

9
เวอร์ชัน fedora จะเป็นrename " " "_" *
David Dean

4
renameไม่มีใน OSX ปรากฏขึ้น
Etienne Low-Décarie

บน macOS 10.12.3 renameพร้อมใช้งาน
Sung Cho

1
@DavidDean การเปลี่ยนชื่อบน Arch Linux จะแทนที่เหตุการณ์แรกเท่านั้น (ไม่สะดวกสำหรับไฟล์ / ไดเร็กทอรีที่มีช่องว่างหลายช่อง) มันมีไวยากรณ์เหมือนกันกับ fedora ดังนั้นฉันสงสัยว่ามันอาจจะเหมือนกัน แต่สามารถติดตั้ง perl-rename ได้
prosoitos

15

ใช้ sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

หากคุณต้องการลองก่อนที่จะดึงทริกเกอร์เพียงแค่เปลี่ยนmvเป็นecho mv.


4

หากคุณใช้ทุบตี:

for file in *; do mv "$file" ${file// /_}; done

เมื่อฉันพยายามฉันได้รับ mv: เมื่อย้ายหลายไฟล์อาร์กิวเมนต์สุดท้ายต้องเป็นไดเร็กทอรีลองmv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'สำหรับข้อมูลเพิ่มเติม
Mithun Sreedharan

อีกครั้งข้อผิดพลาด mv: ไม่มีอาร์กิวเมนต์ไฟล์ลองmv --help' for more information. mv: missing file argument Try mv --help 'สำหรับข้อมูลเพิ่มเติม mv: ไม่มีอาร์กิวเมนต์ไฟล์ลองmv --help' for more information. mv: missing file argument Try mv --help 'สำหรับข้อมูลเพิ่มเติม
Mithun Sreedharan

@ levislevis85: ขอบคุณไม่ทราบว่า
soulmerge

4

จะเกิดอะไรขึ้นถ้าคุณต้องการใช้งานการแทนที่แบบวนซ้ำ ? คุณจะทำอย่างไร?

ฉันเพิ่งค้นพบคำตอบด้วยตัวเอง ไม่ใช่วิธีแก้ปัญหาที่หรูหราที่สุด (พยายามเปลี่ยนชื่อไฟล์ที่ไม่เป็นไปตามเงื่อนไข) แต่ใช้งานได้ (BTW ในกรณีของฉันฉันต้องการเปลี่ยนชื่อไฟล์ด้วย '% 20' ไม่ใช่ขีดล่าง)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

3

นี่คือวิธีแก้ปัญหาอื่น:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. ใช้ awk เพื่อเพิ่มเครื่องหมายคำพูดรอบ ๆ ชื่อไฟล์
  2. ใช้ sed เพื่อแทนที่ช่องว่างด้วยขีดล่าง พิมพ์ชื่อเดิมพร้อมเครื่องหมายคำพูด (จาก awk); จากนั้นชื่อที่ใช้แทน
  3. xargs ใช้ครั้งละ 2 บรรทัดแล้วส่งต่อไปยัง mv

2

ลองทำสิ่งนี้โดยสมมติว่าไฟล์ทั้งหมดของคุณเป็น. txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
ได้รับข้อผิดพลาด tr ด้านล่าง: ต้องกำหนดสองสตริงเมื่อแปล mv: ไม่มีอาร์กิวเมนต์ของไฟล์ลองใช้ `mv --help 'สำหรับข้อมูลเพิ่มเติม
Mithun Sreedharan

2
ข้อผิดพลาด Agin tr: อาร์กิวเมนต์มากเกินไปลองtr --help' for more information. mv: missing file argument Try mv --help 'สำหรับข้อมูลเพิ่มเติม
Mithun Sreedharan

1

อ้างถึงตัวแปรของคุณ:

for file in *; do echo mv "'$file'" "${file// /_}"; done

ลบ "เสียงสะท้อน" เพื่อทำการเปลี่ยนชื่อจริง


มันสะท้อนคำสั่ง mv prperly แต่ไม่ได้เปลี่ยนชื่อไฟล์จริงๆ!
Mithun Sreedharan

การลบ echo ทำให้เกิดข้อผิดพลาดเช่น mv: can't stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว mv: ไม่สามารถ stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP ศ. 14 ส.ค. 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

วิธีที่ง่ายที่สุดที่จะมาแทนที่สตริง (อักขระช่องว่างในกรณีของคุณ) กับสตริงอีกคือการใช้Linux sedคุณสามารถทำได้ดังนี้

sed -i 's/\s/_/g' *

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


สิ่งนี้ไม่ได้ตอบคำถาม
Amit

0

ผมเชื่อว่าคำตอบของคุณที่อยู่ในแทนที่ช่องว่างในชื่อไฟล์ด้วยขีด


1
แม้ว่าสิ่งนี้อาจตอบคำถามได้ในทางทฤษฎี แต่ก็ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และระบุลิงก์สำหรับการอ้างอิง
Bill the Lizard

0

ในการเปลี่ยนชื่อไฟล์ทั้งหมดด้วยไฟล์ .pyนามสกุลให้ใช้ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

ตัวอย่างผลลัพธ์

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.