ฉันต้องการใช้find
เพื่อค้นหาไฟล์ในชุดของโฟลเดอร์ที่ จำกัด ด้วยอักขระตัวแทน แต่ในกรณีที่มีช่องว่างในชื่อพา ธ
จากบรรทัดคำสั่งนี่เป็นเรื่องง่าย ตัวอย่างต่อไปนี้ใช้ได้ทั้งหมด
find te*/my\ files/more -print
find te*/'my files'/more -print
find te*/my' 'files/more -print
เหล่านี้จะหาไฟล์ในตัวอย่างเช่น, และterminal/my files/more
tepid/my files/more
อย่างไรก็ตามฉันต้องการสิ่งนี้เพื่อเป็นส่วนหนึ่งของสคริปต์ สิ่งที่ฉันต้องการคืออะไรเช่นนี้:
SEARCH='te*/my\ files/more'
find ${SEARCH} -print
น่าเสียดายที่สิ่งที่ฉันทำฉันไม่สามารถผสม wildcard และช่องว่างในfind
คำสั่งภายในสคริปต์ได้ ตัวอย่างข้างต้นจะส่งกลับข้อผิดพลาดต่อไปนี้ (ให้สังเกตเครื่องหมายแบ็กสแลชสองเท่าที่ไม่คาดคิด):
find: ‘te*/my\\’: No such file or directory
find: ‘files/more’: No such file or directory
การพยายามใช้อัญประกาศก็ล้มเหลวเช่นกัน
SEARCH="te*/'my files'/more"
find ${SEARCH} -print
สิ่งนี้ส่งคืนข้อผิดพลาดต่อไปนี้โดยไม่สนใจความหมายของเครื่องหมายคำพูด:
find: ‘te*/'my’: No such file or directory
find: ‘files'/more’: No such file or directory
นี่คืออีกตัวอย่างหนึ่ง
SEARCH='te*/my files/more'
find ${SEARCH} -print
อย่างที่คาดไว้:
find: ‘te*/my’: No such file or directory
find: ‘files/more’: No such file or directory
ทุกรูปแบบที่ฉันได้ลองส่งคืนข้อผิดพลาด
ฉันมีวิธีแก้ปัญหาซึ่งอาจเป็นอันตรายได้เพราะมันส่งคืนโฟลเดอร์มากเกินไป ฉันแปลงช่องว่างทั้งหมดเป็นเครื่องหมายคำถาม (อักขระตัวแทนเดียว) เช่นนี้
SEARCH='te*/my files/more'
SEARCH=${SEARCH// /?} # Convert every space to a question mark.
find ${SEARCH} -print
นี่คือเทียบเท่า:
find te*/my?files/more -print
สิ่งนี้ไม่เพียงส่งคืนโฟลเดอร์ที่ถูกต้องเท่านั้น แต่ยังส่งคืนterse/myxfiles/more
ซึ่งไม่ควร
ฉันจะบรรลุสิ่งที่ฉันพยายามทำอย่างไร Google ไม่ได้ช่วยฉัน :(
find "${SEARCH}" -print
?
te*/'my files'/more
(ในตัวอย่างของฉัน)
SEARCH: command not found
ด้วยคำสั่งที่find -print
กำลังดำเนินการ