ฉันมีไฟล์ข้อความที่มีชื่อแพคเกจมากมาย
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]-]*
ลำดับของตัวอักษรตัวเลขและ -