ฉันมีกลุ่มไฟล์ที่มี:
(โคลอน) อยู่ในชื่อ ฉันต้องการแทนที่:
ด้วย-
(เส้นประ)
มีวิธีง่าย ๆ ในการทำสคริปต์หรือไม่?
ตัวอย่างชื่อไฟล์: 2013-10-11:11:52:08_055456663_045585_.txt
ฉันมีกลุ่มไฟล์ที่มี:
(โคลอน) อยู่ในชื่อ ฉันต้องการแทนที่:
ด้วย-
(เส้นประ)
มีวิธีง่าย ๆ ในการทำสคริปต์หรือไม่?
ตัวอย่างชื่อไฟล์: 2013-10-11:11:52:08_055456663_045585_.txt
คำตอบ:
1 ซับง่าย ๆ ควรทำ (สมมติว่า Posix- sh
shell ที่เข้ากันได้):
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 )
ที่ชื่อใหม่จะถูกสร้างขึ้นโดยการดำเนินการที่มีเปลือก สิ่งทีไม่ ...