ฉันมีสคริปต์นี้
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
มันใช้งานได้ดีสำหรับไฟล์ที่ชื่อ001.png
มันจะสร้างขึ้น001.png.txt
แทน001.txt
แทน
ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
ฉันมีสคริปต์นี้
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
มันใช้งานได้ดีสำหรับไฟล์ที่ชื่อ001.png
มันจะสร้างขึ้น001.png.txt
แทน001.txt
แทน
ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
คำตอบ:
คุณสามารถใช้basename
คำสั่งได้ที่นี่:
touch "$folder/$(basename "$filePng" .png).txt"
$folder/
หมายเหตุเพิ่มเติม นี่เป็นสิ่งจำเป็นเนื่องจากคำสั่ง basename จะลบพา ธ ออก
$filePng
- มันมีประโยชน์เช่นกัน
$( )
สร้างบริบทการอ้างอิงใหม่
คุณสามารถลบส่วนขยายที่มีอยู่โดยใช้คุณสมบัติการขยายพารามิเตอร์ของเชลล์
${parameter%pattern}
'รูปแบบ' ตรงกับจุดสิ้นสุดของ 'พารามิเตอร์' ผลลัพธ์คือค่าที่ขยายของ 'พารามิเตอร์' พร้อมลบการจับคู่ที่สั้นที่สุด
ดังนั้นในกรณีของคุณแทนที่$filePng.txt
ด้วย"${filePng%.png}.txt"
ด้วยความผันแปรของสิ่งที่ Steeldriver ได้กล่าวถึงแล้ว - การขยายพารามิเตอร์ - เราสามารถใช้การแทนที่สตริงเพื่อทำงาน นอกจากนี้คุณควรอ้างอิงตัวแปร ด้านล่างเป็นสคริปต์ที่แก้ไขของคุณ
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in "$folder"/*
do
touch "${filePng/.png/.txt}"
done
หากคุณมีมากไฟล์จะสร้างมันจะคุ้มค่าที่จะ "แตะ" มากกว่าหนึ่งไฟล์ในแต่ละครั้งดังนั้นคุณไม่จำเป็นต้องแยกกระบวนการใหม่ให้กับแต่ละไฟล์ (ซึ่งใช้เวลาค่อนข้างนานในการดำเนินการหลายอย่าง พันครั้ง)
xargs
ตัวเลือกนี้จะให้หลายเส้นทางไปยังtouch
คำสั่งในครั้งเดียวมักจะไม่กี่พันหรืออะไรก็ตามที่ระบบสามารถพอดีกับบรรทัดคำสั่งเดียว
find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --
ตัวเลือกนี้ไม่ทำงานtouch
เลย แต่ใช้คุณลักษณะเชลล์ของ Bash / Bourne / POSIX แทนซึ่งไม่ต้องการกระบวนการย่อยเลย
for f in "$folder"/*.png; do
: >> "${f%.png}.txt"
done
หากคุณมั่นใจว่าคุณไม่มีไฟล์.png
อยู่ที่ไหนสักแห่งในชื่อกลางคุณสามารถใช้อาร์เรย์ที่มีการขยายพารามิเตอร์ได้:
pngs=( /path/to/pngs/*.png )
touch "${pngs[@]/.png/.txt}"
ร้านค้าทั้งหมดนี้เส้นทางไปยังไฟล์ที่ลงท้ายด้วย.png
ในอาร์เรย์แล้วใช้การขยายตัวพารามิเตอร์ในการสร้างรายชื่อของ.txt
ไฟล์โดยการแทน.png
สำหรับ.txt
ในแต่ละ
touch
จำไว้ว่านี้จะแตกถ้าคุณมีไฟล์จำนวนมากที่พวกเขาไม่สามารถทั้งหมดจะผ่านอาร์กิวเมนต์ไปที่ภาวนาเดียวกันของ
for filePng in "$folder"/*
และtouch "$filePng".txt
- หมายเหตุ:$
คุณพูดพวกเขาเมื่อนำหน้าด้วย