เปลี่ยนชื่อไฟล์ทั้งหมดในไดเรกทอรีจาก $ filename_h เป็น $ filename_half?


139

ง่ายตาย

ฉันจะเปลี่ยนชื่อได้อย่างไร

05_h.png
06_h.png

ถึง

05_half.png
06_half.png

อย่างน้อยฉันคิดว่ามันง่าย แต่ Google ก็ยากสำหรับเรื่องแบบนี้เว้นแต่คุณจะรู้อยู่แล้ว

ขอบคุณ ....

คำตอบ:


302

เพียงใช้ bash ไม่จำเป็นต้องโทรออกคำสั่งจากภายนอก

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

อย่าเพิ่ม #!/bin/sh

สำหรับผู้ที่ต้องการซับในหนึ่งอัน:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
การใช้งานที่ดีของการทุบตีในตัวทดแทนสตริงมากกว่า sed
dandrews

3
คือไฟล์ / _h.png / _half.png regex?
user2799603

15
ไม่รูปแบบคือ: $ {string / substring / substit} - "replace fi rst เกิดขึ้น" สำหรับข้อมูลเพิ่มเติมตรวจสอบชีตชีตนี้ (ส่วน "strings"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider

11
มีสาเหตุDo not add #!/bin/shอะไรบ้าง? ฉันลองทั้งสองทำงานโดยมี / ไม่มีข้อความนี้
Ryan

6
@Ryan @Ishan Jain อันที่จริงแล้วมันบ่งชี้เชลล์แบ็คเอนด์ที่ต้องรันสคริปต์ sh และ bash เป็นเชลล์ที่แตกต่างกันดังนั้นจึงอาจส่งผลต่อพฤติกรรมของสคริปต์และไวยากรณ์ #!/bin/bashตั้งแต่สคริปต์ที่ใช้ทุบตีในตัวทดแทนสตริงคุณควรเพิ่มส่วนหัว สิ่งนี้กล่าวว่าโดยทั่วไปแล้ว bash จะเป็นเชลล์เริ่มต้นในคอมพิวเตอร์หลายเครื่องดังนั้นคุณจะไม่พบความแตกต่างมากมาย: D คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่
Cristian Ramon-Cortes

65

ลองrenameคำสั่ง:

rename 's/_h.png/_half.png/' *.png

ปรับปรุง:

ตัวอย่างการใช้งาน:

สร้างเนื้อหาบางส่วน

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

วิธีทดสอบ:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou: ฉันได้เพิ่มเซสชันการทดสอบตัวอย่าง โปรดลอง คุณอาจพิมพ์ผิด อะไรคือผลลัพธ์ของls? สิ่งที่เป็นrename ...คุณลอง?
MichałŠrajer

2
ไม่ทำงานบนทุบตีบน Mac fwiw renameไม่ใช่เครื่องมือ Unix มาตรฐาน
tandrewnichols

1
@trewrewnichols ลองใช้homebrew - เมื่อติดตั้งแล้วจะสามารถเปลี่ยนชื่อได้ในไม่กี่วินาทีด้วยbrew install rename
Simbamangu

4
สำหรับฉันเปลี่ยนชื่อไม่ได้ทำงานกับ's//'- ฉันอ้างอิงคนและมีเรื่องย่อง่าย ๆ : rename [options] expression replacement file...บน CentOS 7 รุ่น:rename from util-linux 2.23.2
tymik

2
โปรดจำไว้ว่า.ตรงกับอักขระใด ๆ ไม่ใช่แค่จุด - สำหรับจุดตัวอักษรใช้\.แทน
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับการทำแห้งก่อน ฉันแรกแทนที่mv $f $fnewด้วยecho $fnewเป็นบรรทัดที่สองเพื่อให้แน่ใจว่าผลลัพธ์ดูมีเหตุผล
lobati

10

คุณกำลังมองหาวิธีทุบตีบริสุทธิ์หรือไม่? มีหลายวิธี แต่นี่เป็นวิธีหนึ่ง

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

สิ่งนี้จะถือว่าไฟล์เดียวในไดเรกทอรีปัจจุบันที่ลงท้ายด้วย_h.pngคือไฟล์ที่คุณต้องการเปลี่ยนชื่อ

โดยเฉพาะอย่างยิ่งมากขึ้น

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

สมมติว่าทั้งสองตัวอย่างเป็นของคุณเท่านั้น ไฟล์

สำหรับกรณีทั่วไปในการเปลี่ยนชื่อไฟล์ได้ รับ การคุ้มครอง ก่อน


6

ใช้renameยูทิลิตี้ที่เขียนเป็นภาษา Perl อาจเป็นไปได้ว่าไม่สามารถใช้งานได้ตามค่าเริ่มต้นแม้ว่า ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png


4

ฉันมีคำถามที่คล้ายกัน: ในคู่มืออธิบายการเปลี่ยนชื่อเป็น

rename [option] expression replacement file

ดังนั้นคุณสามารถใช้วิธีนี้ได้

rename _h _half *.png

ในรหัส: '_h' คือนิพจน์ที่คุณกำลังมองหา '_half' เป็นรูปแบบที่คุณต้องการแทนที่ด้วย '* .png' คือช่วงของไฟล์ที่คุณกำลังมองหาไฟล์เป้าหมายที่เป็นไปได้

หวังว่าสิ่งนี้จะช่วยค:


1

วิธีการอื่นสามารถด้วยตนเองโดยใช้ตัวเลือกการเปลี่ยนชื่อแบทช์

คลิกขวาที่ไฟล์ -> คำสั่งไฟล์ที่กำหนดเอง -> เปลี่ยนชื่อแบทช์และคุณสามารถแทนที่ h กับครึ่ง

สิ่งนี้จะทำงานกับ gui ที่ใช้ linux โดยใช้ WinSCP เป็นต้น


0

ใช้renameยูทิลิตี้:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png


0

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

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.