ฉันต้องการรับไฟล์ทั้งหมดในไดเรกทอรีที่แน่นอนใน 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*')ในกรณีที่ไม่มีไฟล์ที่ตรงกัน