ฉันมีกลุ่มไฟล์ที่มี:(โคลอน) อยู่ในชื่อ ฉันต้องการแทนที่:ด้วย-(เส้นประ)
มีวิธีง่าย ๆ ในการทำสคริปต์หรือไม่?
ตัวอย่างชื่อไฟล์: 2013-10-11:11:52:08_055456663_045585_.txt
ฉันมีกลุ่มไฟล์ที่มี:(โคลอน) อยู่ในชื่อ ฉันต้องการแทนที่:ด้วย-(เส้นประ)
มีวิธีง่าย ๆ ในการทำสคริปต์หรือไม่?
ตัวอย่างชื่อไฟล์: 2013-10-11:11:52:08_055456663_045585_.txt
คำตอบ:
1 ซับง่าย ๆ ควรทำ (สมมติว่า Posix- shshell ที่เข้ากันได้):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
คำอธิบาย:
for ... in ...; do ...; doneเป็นห่วง
*:* จับคู่ไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรีปัจจุบันซึ่งมี:ชื่ออยู่
f ถูกกำหนดในแต่ละชื่อไฟล์ดังกล่าวในลูป
mvเปลี่ยนชื่ออาร์กิวเมนต์แรกเป็นอาร์กิวเมนต์ที่สอง -v(verbose) ขอให้พิมพ์สิ่งที่มันทำ; ตัวเลือกนี้มีเฉพาะGNU-utilsดังนั้นจึงพร้อมใช้งานบน Linux แต่ไม่ใช่ Solaris
echo พิมพ์อาร์กิวเมนต์ไปที่เอาต์พุตมาตรฐาน
tr อ่านเอาต์พุตมาตรฐานและแปลอักขระตามแผนที่ที่ให้มา
หากคุณกำลังใช้ทุบตีคุณสามารถหลีกเลี่ยงการวางไข่เปลือกพิเศษ ( $()) กับกระบวนการย่อย ( tr) โดยการแทนที่ด้วย$(...)${f//:/-}
$(echo "$f" | tr ':' '-')ด้วย"${f//:/-}"และหลีกเลี่ยงการเรียก subshell ไปป์และโปรแกรมภายนอก ฉันคิดว่านี่เป็นเรื่องน่าเบื่อ แต่ก็ใช่มั้ย ดูที่นี่
ตามที่ระบุไว้ในโพสต์อื่นโดยฉันrenameเครื่องมือสามารถทำเคล็ดลับสำหรับคุณ คุณเพียงแค่ต้องพิมพ์
rename s/:/-/ <files to rename>
นี้แทนที่ทุกเครื่องหมายจุดในทุกไฟล์ที่คุณชื่อในตอนท้ายคือ2013-10-*
นี่คือลิงค์ไปยังโพสต์อื่นของฉัน
ฉันแน่ใจว่าโปร UNIX สามารถทำได้ด้วยการทุบตี แต่นี่เป็นเวอร์ชั่นที่รวดเร็วและสกปรกของฉันกับทับทิม
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
ตั้งค่า path_to_files เป็นพา ธ ไปยังไฟล์ที่คุณใช้ผิด บันทึกรหัสข้างต้นในไฟล์ชื่อ rename.rb แล้ว:
username@machinename$ ruby rename.rb
หากคุณมีไฟล์เพียงหนึ่งหรือสองสามไฟล์คุณสามารถเปลี่ยนชื่อได้ดังนี้
p="201*"จัดเก็บรูปแบบของชื่อไฟล์ที่คุณกำหนดเป้าหมายเป็นตัวแปรนี้:old_name=$(ls | grep $p)ที่คุณต้องการจะเปลี่ยนชื่อ:เก็บชื่อไฟล์ใหม่ด้วยการเปลี่ยนอักขระที่จำเป็น:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
โบนัสทำความสะอาด :
หากเห็นแก่ความสม่ำเสมอคุณต้องการแทนที่เครื่องหมายขีดคั่น (-) พร้อมกับเครื่องหมายจุดคู่ (:) ด้วยเครื่องหมายขีดล่าง (_) คุณสามารถทำสิ่งนี้ได้:
new_name=$(ls | grep $p | tr ':-' '_');
ข หากคุณต้องการขีดเส้นใต้สุดท้าย (ก่อนหน้า.txt) หายไปให้ตั้งค่าnew_nameตัวแปรเป็น:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mvจะล้มเหลวหากชื่อไฟล์ใด ๆ ในการดำเนินการเปลี่ยนชื่อนั้นมีspacesอยู่ในนั้น ในกรณีนั้นให้ตัดตัวแปรที่เหมาะสมในเครื่องหมายคำพูดเช่น: mv "$old_name" $new_name หรือ mv $old_name "$new_name" OR mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
สิ่งนี้อาจเกินความจริง แต่คุณสามารถเปลี่ยนชื่ออักขระพิเศษด้วยสคริปต์ได้ที่ลิงค์ที่ให้ไว้ในคำตอบนี้:
for f in... ห่วงเป็นห่วงซึ่ง iterates*:*กว่าไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่ไฟล์จะต้องมีการแข่งขัน (เกิดอะไรขึ้นกับ dirs ที่ตรงกัน?) คำสั่งย้ายเป็นไป NewName oldname$( subshell here )ที่ชื่อใหม่จะถูกสร้างขึ้นโดยการดำเนินการที่มีเปลือก สิ่งทีไม่ ...