ฉันต้องการรับไฟล์ทั้งหมดในไดเรกทอรีที่แน่นอนใน bash array (สมมติว่าไม่มีไฟล์ใดมี newline ในชื่อ):
ดังนั้น:
myarr=()
find . -maxdepth 1 -name "mysqldump*" | mapfile -t myarr; echo "${myarr[@]}"
ผลลัพธ์ว่างเปล่า!
ถ้าฉันใช้วงเวียนในการใช้ไฟล์ชั่วคราวหรืออย่างอื่น:
myarr=()
find . -maxdepth 1 -name "mysqldump*" > X
mapfile -t myarray < X
echo "${myarray[@]}"
ผลลัพธ์!
แต่ทำไมไม่mapfile
อ่านอย่างถูกต้องจากไปป์?
find
และmapfile
ที่นี่เลยไม่ใช่แค่myarr=(mysqldump*)
? สิ่งนี้จะทำงานกับชื่อไฟล์ที่มีช่องว่างและการขึ้นบรรทัดใหม่
nullglob
ตัวเลือกใน ( shopt -s nullglob
) เพื่อที่myarr=(mysqldump*)
จะไม่จบลงด้วยอาร์เรย์('mysqldump*')
ในกรณีที่ไม่มีไฟล์ที่ตรงกัน