ลบบรรทัด N สุดท้ายจากประวัติทุบตี


40

เมื่อตั้งใจวางไฟล์ลงในเชลล์มันจะใส่รายการไร้สาระที่น่าเกลียดมากมายในประวัติทุบตี มีวิธีที่สะอาดในการลบรายการเหล่านั้นหรือไม่ เห็นได้ชัดว่าฉันสามารถปิดเชลล์และแก้ไข.bash_historyไฟล์ด้วยตนเอง แต่อาจมี API บางชนิดที่สามารถแก้ไขประวัติของเชลล์ปัจจุบันได้หรือไม่

คำตอบ:


36

คุณสามารถใช้history -d offsetbuiltin เพื่อลบบรรทัดที่ระบุจากประวัติเชลล์ปัจจุบันหรือhistory -cเพื่อล้างประวัติทั้งหมด

มันใช้ไม่ได้จริง ๆ ถ้าคุณต้องการลบช่วงของเส้นเนื่องจากมันจะใช้เวลาเพียงหนึ่งออฟเซ็ตเป็นอาร์กิวเมนต์ แต่คุณสามารถใส่มันในฟังก์ชันที่มีลูป

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

rmhist first_line_to_delete last_line_to_deleteเรียกมันว่าด้วย (หมายเลขบรรทัดตามผลลัพธ์ของhistory.)

(ใช้history -wเพื่อบังคับให้เขียนไฟล์ประวัติ)


1
ตั้งแต่ OP ขอลบ N สุดท้ายเส้นสคริปต์นี้ควรจะแก้ไขด้วยการทำสิ่งที่ชอบ: แล้วทำซ้ำtot_lines=$(history | wc -l) history -d $(( tot_lines - $1 ))
PlasmaBinturong

2
แทนที่จะ$(history | wc -l)มีตัวแปร$HISTCMDที่สามารถใช้ได้
PlasmaBinturong

28

ซับในพรอมต์คำสั่งนี้จะช่วยให้

for i in {1..N}; do history -d START_NUM; done

ตำแหน่งที่ START_NUM เริ่มต้นตำแหน่งการเข้าในประวัติศาสตร์ N คือจำนวนรายการที่คุณอาจต้องการลบ

อดีต: for i in {1..50}; do history -d 1030; done


3
ฉันสงสัยว่าทำไมนี่ไม่ใช่ฟังก์ชั่นในตัวอยู่แล้ว 'history' เป็นเครื่องมือที่เก่ามาก
Petr Gladkikh

มีจุดมุ่งหมายดีมาก แต่คำสั่งนี้สามารถมองเห็นได้ในประวัติศาสตร์ :)
Rajeev Akotkar

askubuntu.com/a/978276/22866มีวิธีที่ดีในการลบ "ลบจากคำสั่งประวัติ" จาก history :-)
HanSooloo

0

คำตอบโดย user2982704 เกือบจะได้ผลสำหรับฉัน แต่ไม่มาก ฉันต้องทำรูปแบบขนาดเล็กเช่นนี้

สมมติว่าประวัติของฉันอยู่ที่ 1,000 และฉันต้องการลบ 50 รายการสุดท้าย

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.