ใช้ '*' ในเชลล์สคริปต์

Oct 14 2020

ฉันพยายามเรียกใช้ตัวอย่างคำสั่ง:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/

ใช้งานได้ดีในเทอร์มินัล แต่เมื่อฉันพยายามเพิ่มสิ่งนี้ในเชลล์สคริปต์ ( .sh) ฉันได้รับข้อผิดพลาดว่า:

mv: cannot stat '/home/vaishnavi/Downloads/*.ttf': No such file or directory

ในกรณีนี้ฉันต้องการย้ายไฟล์ทั้งหมด.ttfและ.ttcพิมพ์ไปที่ /usr/local/share/fonts/ms_fonts/พูดตามตรงว่าฉันไม่ค่อยเชี่ยวชาญเรื่องเชลล์สคริปต์ โปรดอธิบายให้ฉันทราบว่าฉันทำผิดอะไรและเป็นทางเลือกอื่นเพื่อให้บรรลุผลลัพธ์ที่คาดหวัง

สคริปต์ตัวอย่างของฉัน:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/  
...

exit 0

คำตอบ

3 glennjackman Oct 14 2020 at 19:32

คุณจะได้รับข้อผิดพลาดนี้หากไม่มีไฟล์ * .ttf อยู่ที่นั่น ตามค่าเริ่มต้นหากไม่มีไฟล์ใดที่ตรงกับรูปแบบ glob รูปแบบนั้นจะยังคงอยู่ในคำสั่ง ปิดสิ่งนี้ด้วยnullglobตัวเลือกbash shell

เพื่อความปลอดภัยยิ่งขึ้นให้ตรวจสอบว่ามีบางไฟล์ที่ต้องย้ายจริงๆ:

#!/usr/bin/env bash
...
shopt -s nullglob
# store files in an array
files=( /home/vaishnavi/Downloads/*.{ttc,ttf} )
# and if the array is not empty, move the files.
if (( ${#files[@]} > 0 )); then sudo mv -t /usr/local/share/fonts/ms_fonts/ "${files[@]}" 
fi