เอาล่ะมาใช้ปรัชญา unix กันดีกว่า องค์ประกอบของงานนี้คืออะไร?
- การค้นหาข้อความ: คุณต้องการเครื่องมือในการค้นหาข้อความในไฟล์เช่น
grep
คุณต้องการเครื่องมือในการค้นหาข้อความในไฟล์เช่น
- แบบเรียกซ้ำ: คุณต้องใช้เครื่องมือเพื่อค้นหาไฟล์ในแผนผังไดเรกทอรีเช่น
find
คุณต้องการเครื่องมือที่จะไปมองหาไฟล์ในต้นไม้ไดเรกทอรีเช่น
- คลังเก็บ: คุณต้องการเครื่องมือในการอ่าน
โปรแกรม unix ส่วนใหญ่ทำงานกับไฟล์ ดังนั้นในการทำงานกับส่วนประกอบที่เก็บถาวรได้ง่ายคุณจำเป็นต้องเข้าถึงมันเป็นไฟล์หรือกล่าวอีกนัยหนึ่งว่าคุณต้องเข้าถึงมันในรูปของไดเร็กตอรี่
AVFSระบบแฟ้มนำเสนอมุมมองของระบบแฟ้มที่ทุกไฟล์เก็บถาวรสามารถเข้าถึงได้เป็นไดเรกทอรี/path/to/foo.zip
~/.avfs/path/to/foo/zip#
AVFS จัดให้มีการเข้าถึงรูปแบบไฟล์เก็บถาวรทั่วไปอย่างมาก
mountavfs
find ~/.avfs"$PWD" \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*.pm" -exec grep "$1" {\} +
' {} 'Test::Version' \;
fusermount -u ~/.avfs # optional
คำอธิบาย:
- เมานต์ระบบไฟล์ AVFS
- ค้นหาไฟล์เก็บถาวร
~/.avfs$PWD
ซึ่งเป็นมุมมอง AVFS ของไดเรกทอรีปัจจุบัน
- สำหรับแต่ละไฟล์เก็บถาวรให้ดำเนินการตัวอย่างเชลล์ที่ระบุ (ด้วย
$0
ชื่อ = ไฟล์เก็บถาวรและ$1
รูปแบบ = เพื่อค้นหา)
$0#
$0
เป็นมุมมองของไดเรกทอรีที่เก็บ
{\}
แทนที่จะ{}
ต้องการในกรณีที่การfind
แทนที่ภายนอก{}
ภายใน-exec ;
อาร์กิวเมนต์ (บางคนทำมันบางคนไม่ได้)
- ทางเลือก: ในที่สุดก็ยกเลิกการต่อเชื่อมระบบไฟล์ AVFS
หรือใน zsh ≥4.3:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*.pm(.N))
'\')
คำอธิบาย:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip)
จับคู่ไฟล์เก็บถาวรในมุมมอง AVFS ของไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อย
PATTERN(e\''CODE'\')
ใช้รหัสกับการแข่งขันแต่ละแบบ $REPLY
ชื่อของแฟ้มที่ตรงกับที่อยู่ใน การตั้งค่าreply
อาร์เรย์เปลี่ยนการจับคู่ให้เป็นรายการของชื่อ
$REPLY\#
คือมุมมองไดเร็กทอรีของไฟล์เก็บถาวร
$REPLY\#/**/*.pm
จับคู่.pm
ไฟล์ในไฟล์เก็บถาวร
- ตัวระบุแบบ
N
หมุนทำให้รูปแบบขยายเป็นรายการที่ว่างเปล่าหากไม่มีการจับคู่