โดยใช้ apt-ไฟล์
ฉันสามารถค้นหาแพ็คเกจที่ให้ไฟล์ปฏิบัติการบางอย่างเช่นนี้:
ค้นหา sudo apt-file {/bin,/sbin,/usr/bin/,/usr/sbin}/wget
จริงๆแล้ว:
ค้นหา sudo apt-file {/bin,/sbin,/usr/bin/,/usr/sbin}/wget | เกรป "/wget$"
(เพราะมิฉะนั้นก็จะส่งคืนแพ็คเกจทั้งหมดที่มีไฟล์ปฏิบัติการที่ขึ้นต้นด้วย ว้าว
.)
ตอนนี้ฉันกำลังวิ่ง:
EXEC_NAME="x86_64-w64-mingw32-g++"
ค้นหา sudo apt-file {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME} | เกรป "${EXEC_NAME}$"
และน่าแปลกที่มันไม่ได้คืนอะไรเลย ทำไม เนื่องจากไม่มีแพ็คเกจใดให้ไฟล์ที่มีชื่อนั้น
ถ้าฉันวิ่ง:
EXEC_NAME="x86_64-w64-mingw32-g++"
ค้นหา sudo apt-file {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME}
ฉันได้รับผลลัพธ์ต่อไปนี้:
g++-mingw-w64-x86-64-posix: /usr/bin/x86_64-w64-mingw32-g++-posix
g++-mingw-w64-x86-64-win32: /usr/bin/x86_64-w64-mingw32-g++-win32
หมายความว่าไม่มีแพ็คเกจให้บริการ x86_64-w64-mingw32-g++
.
แต่หลังจากนั้นไม่นานฉันก็พบว่า g++-mingw-w64-x86-64-posix
ไม่เพียงแค่จัดเตรียมไฟล์ปฏิบัติการเท่านั้น g++-mingw-w64-x86-64-posix
แต่ยังเรียกนามแฝงหรือสัญลักษณ์เชื่อมโยง g++-mingw-w64-x86-64
.
ในกรณีนี้ มันง่ายที่จะเข้าใจเพราะแพ็คเกจมีไบนารีอื่นที่มีชื่อคล้ายกันมาก ตอนนี้ปัญหาของฉันคือฉันต้องทำให้สิ่งนี้เป็นอัตโนมัติในแบบที่ใช้ได้กับนามแฝง/symlink ใดๆ แม้กระทั่งสำหรับอันที่มีชื่อต่างกันโดยสิ้นเชิง
ฉันจะทำสิ่งนี้ได้อย่างไร
แก้ไข:
นามแฝงถูกสร้างขึ้นในไฟล์ g++-mingw-w64-x86-64-posix.postinst
ของ g++-mingw-w64-x86-64-posix
แพ็คเกจในกรณีที่ช่วย:
ทางเลือกในการปรับปรุง -- ติดตั้ง /usr/bin/x86_64-w64-mingw32-g++ x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix 30 \
--ทาส /usr/bin/x86_64-w64-mingw32-c++ x86_64-w64-mingw32-c++ /usr/bin/x86_64-w64-mingw32-c++-posix
แก้ไข 2:
อาจมีวิธีค้นหาเนื้อหาไฟล์ของแพ็คเกจทั้งหมดหรือไม่' .postinst
ไฟล์? อาจจะโดยการดาวน์โหลดทั้งหมด .postinst
ไฟล์ลงในแคช? อาจทำได้โดยการดาวน์โหลดส่วนหัวของไฟล์ของแต่ละแพ็คเกจก่อนเพื่อดูว่าไฟล์ .postinst อยู่ที่ไบต์ใดในไฟล์เก็บถาวร จากนั้นใช้คำขอช่วง HTTP เพื่อดาวน์โหลด
แก้ไข 3:
สิ่งนี้ไม่ได้เปลี่ยนแปลงอะไร แต่ฉันพบว่าแทนที่จะเป็น grep และ cut คุณสามารถใช้ -x
และ -l
ธง. สิ่งนี้ทำให้คำสั่งสั้นลงเล็กน้อย:
sudo apt-file search -l -x "^/(bin|sbin|usr/bin|usr/sbin)/${EXEC_NAME}$" | หัว -1