ฉันมีไฟล์ข้อความที่มีชื่อแพคเกจมากมาย
package1
package2
# comment
# installing package3 because it was needed for...
package 3
package 4
ฉันจะติดตั้งแพคเกจทั้งหมดภายในไฟล์ข้อความโดยไม่ต้องลบความคิดเห็นได้อย่างไร
ฉันมีไฟล์ข้อความที่มีชื่อแพคเกจมากมาย
package1
package2
# comment
# installing package3 because it was needed for...
package 3
package 4
ฉันจะติดตั้งแพคเกจทั้งหมดภายในไฟล์ข้อความโดยไม่ต้องลบความคิดเห็นได้อย่างไร
คำตอบ:
บางสิ่งบางอย่างตามสายเหล่านี้ควรทำเคล็ดลับ
apt-get install $(grep -vE "^\s*#" filename | tr "\n" " ")
การก่อสร้าง $ (บางอย่าง) เรียกใช้คำสั่งsomethingใส่เอาต์พุตลงในบรรทัดคำสั่ง
คำสั่ง grep จะไม่รวมบรรทัดใด ๆ ที่ขึ้นต้นด้วย # อนุญาตให้เว้นวรรคก่อนหน้าก็ได้ จากนั้นคำสั่ง tr จะแทนที่บรรทัดใหม่ด้วยช่องว่าง
trจะล้มเหลวด้วยลำดับหลายบรรทัดสุดท้าย (คิด\r\n) ทำไมคุณไม่ใช้xargs?
คำสั่งต่อไปนี้เป็นการปรับปรุง (เล็กน้อย) เหนือทางเลือกเนื่องจากsudo apt-get installจะไม่ถูกดำเนินการเมื่อรายการแพ็กเกจว่างเปล่า
xargs -a <(awk '! /^ *(#|$)/' "$packagelist") -r -- sudo apt-get install
โปรดทราบว่า-aตัวเลือกจะอ่านรายการโดยตรงจากไฟล์แทนที่จะเป็นอินพุตมาตรฐาน เราไม่ต้องการที่จะท่อไฟล์เป็นxargsเพราะ stdin apt-getต้องยังคงไม่เปลี่ยนแปลงสำหรับการใช้งานโดย
xargsเป็นวิธีที่เหมาะสมในการทำเช่นนี้ เคล็ดลับ<()คือเรียบร้อย
xargsทำให้แน่ใจARG_MAX ไม่ถึง
xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y installไม่ใช่ " <(" แต่ " $(" และตัวเลือก-yสำหรับ apt-get จะเป็นความคิดที่ดี
awkไปเป็น file descriptor เพื่อxargs -aให้อ่าน ดังนั้นคุณต้องการ<(และไม่$(แน่นอน ลองแล้วคุณจะเห็นสิ่งที่ฉันหมายถึง หากคำสั่งทำงานแบบอัตโนมัติและคุณรู้อยู่แล้วว่ากำลังจะติดตั้งอะไรแน่นอนว่าคำสั่งนั้นเป็น-yความคิดที่ดี
รับไฟล์รายการแพ็คเกจpackage.listลอง:
sudo apt-get install $(awk '{print $1'} package.list)
นี่คือทางออกของฉันในการติดตั้งรายการแพคเกจที่ฉันมีสำหรับการติดตั้งใหม่:
sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "filename")
ในbashฟังก์ชั่น:
aptif () {
sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "$1")
}
grep คำอธิบาย:
-o เก็บเฉพาะบางส่วนของบรรทัดที่ตรงกับนิพจน์^[^#] สิ่งที่ไม่ได้เริ่มต้นด้วย #[[:alnum]-]* ลำดับของตัวอักษรตัวเลขและ -