কোনও প্রদত্ত স্ট্রিংয়ের সাথে মিল রেখে ইতিহাসে কমান্ডগুলি কীভাবে মুছবেন?


13

আমার ইতিহাসের স্ট্রিংয়ের সাথে মিলে সমস্ত কমান্ড মুছতে হবে। আমি চেষ্টা করেছিলাম:

$ history | grep searchstring | cut -d" " -f2 | history -d
-bash: history: -d: option requires an argument

$ history | grep searchstring | cut -d" " -f2 | xargs history -d
xargs: history: No such file or directory

$ temparg() { while read i; do "$@" "$i"; done }
$ history | grep searchstring | cut -d" " -f2 | temparg history -d
(no error, but nothing is deleted)

এটি করার সঠিক উপায় কী?


1
নীচে কাজের উত্তর থাকা অবস্থায় আমি এখনও অবাক হয়েছি কেন এটি কাজ করে না history -d X। আমি এই প্রশ্নটি পেরিয়ে এসেছি কারণ আমি সবেমাত্র করেছি history | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; done। কোনও ত্রুটি নেই, তবে কিছুই মুছে ফেলা হয়নি। কেন কেউ ব্যাখ্যা করতে পারেন?
mivk

উত্তর:


18

historyকমান্ড শুধু আপনার ইতিহাস ফাইলের উপর কাজ করে, $HISTFILE(সাধারণত ~/.historyবা ~/.bash_history)। আপনি কেবলমাত্র সেই ফাইলটি থেকে লাইনগুলি সরিয়ে ফেললে এটি আরও সহজ হবে, যা বিভিন্ন উপায়ে করা যায়। grepএটি একটি উপায়, তবে ফাইলটি পড়ার সময় আপনাকে ফাইলটি ওভাররাইট না করার বিষয়ে সতর্ক থাকতে হবে:

$ grep -v searchstring "$HISTFILE" > /tmp/history
$ mv /tmp/history "$HISTFILE"

এর সাথে আর একটি উপায় রয়েছে sed:

$ sed -i '/searchstring/d' "$HISTFILE"

ভাল উত্তর; $HISTFILEস্পেস থাকতে পারে, সম্ভবত এটি উদ্ধৃত মূল্য।
ক্রিস ডাউন

সাবধানী ... হিস্টফাইলটি অনির্দেশ্য, আপনার যদি অনেকগুলি খোলা শেল থাকে তবে এটি ঠিক কী সংরক্ষণ হবে এবং কোন ক্রমে হবে তা বলার অপেক্ষা রাখে না। কেউ কি নিশ্চিত করতে পারেন যে ইতিমধ্যে খোলা শেলগুলি যখন বন্ধ হবে তখন তারা আরম্ভের সময় লোড করা ইতিহাসটি পুনরায় লিখবে না?
প্রাচ্য

8

আপনি যদি বর্তমান অধিবেশন থেকে আদেশগুলি সরিয়ে নেওয়ার বিষয়ে চিন্তা না করেন তবে মাইকেল মরোজকের উত্তর কাজ করবে। যদি আপনি এটি করেন তবে তার পোস্টে ক্রিয়াকলাপ সম্পাদন করার আগে আপনার ইতিহাস ফাইলে লিখতে হবে history -a

এছাড়াও, আপনি এন্ট্রি যে আপনি আপনার ইতিহাস ফাইল থেকে চান সরিয়ে দিয়েছি, আপনি এটি জারি করে পুনরায় লোড করতে পারেন history -c, তারপর history -r


3

ওয়ান-লাইনার সন্ধানকারীদের জন্য:

while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done

সুতরাং, যদি আপনি উদাহরণস্বরূপ করতে চান। এতে একটি পাসওয়ার্ড সহ একাধিক লাইন মুছুন, কেবল পাসওয়ার্ডের সাথে "SEARCH_STRING_GOES_HERE" প্রতিস্থাপন করুন। এটি সেই অনুসন্ধানের স্ট্রিংয়ের জন্য আপনার পুরো ইতিহাস অনুসন্ধান করবে এবং এটি মুছবে।

2 জিনিস সচেতন হতে হবে

  • আর্গুমেন্ট হিসাবে আপনি যদি -F সরবরাহ না করেন তবে গ্রেপ রিজেক্স ব্যবহার করে
  • কমান্ডটি 1 টি ত্রুটি প্রদর্শন করবে, একবার আর কোনও মিল নেই। বাদ দাও.

আমি একটি ত্রুটি পেয়েছি (-বাশ: ইতিহাস: -d: বিকল্পের একটি যুক্তি প্রয়োজন), কিন্তু এটি এখনও কার্যকর হয়েছে?
প্যারাড্রয়েড

1
এটি অবিচ্ছিন্নভাবে মুছে ফেলুন কমান্ড চালায়, যতক্ষণ না এটি কোনও ত্রুটির সাথে ব্যর্থ হয় (কারণ মোছার জন্য আর কিছুই নেই)। শুধু ত্রুটি উপেক্ষা করুন।
thelogix

এটি কেবল অনলাইনই নয়, সঠিক সহজ উত্তরও। হ্যাঁ ত্রুটি সম্পর্কে বিভ্রান্ত হবেন না history: -d: option requires an argument! এটি প্রত্যাশিত লুপ => এর শেষের দিকে - এটি কাজ করে এবং পরে মূলত "আমি অন্য কিছু খুঁজে পাচ্ছি না!" :)
jave.web

2

মাইকেল এবং ক্রিসের উত্তরের উপর ভিত্তি করে আমি নিম্নলিখিতগুলি নিয়ে এসেছি। এটি আপনার ~/.bashrcফাইলে যুক্ত করুন এবং তারপরে এটি লোড করুন . ~/.bashrcবা এর সাথে source ~/.bashrc

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Examples
        hxf "rm -rf"
        hxf ^source

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#The unalias prevents odd errors when calling". ~/.bashrc" (May result in
#"not found" errors. That's okay).
unalias hxf
hxf()  {
    read -r -p "About to delete all items from history that match \"$1\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        echo -e "grep -v \"$1\" \"$HISTFILE\" > /tmp/history"
        grep -v "$1" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        echo "history -c"
        history -c

        #Overwrite the actual history file with the temp one.
        echo -e "mv /tmp/history \"$HISTFILE\""
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        echo -e "history -r \"$HISTFILE\""
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

1
cat "$HISTFILE" | grep -v "commandToDelete" >> "$HISTFILE" && exit

এটি আমার পক্ষে কাজ করেছে। ইতিহাস -c && ইতিহাস - আমার জন্য ইতিহাস ফাইলটি সঠিকভাবে পুনরায় লোড করে না didn't সুতরাং পরিবর্তে আমি ঠিক ঠিক আমার ইতিহাসের ফাইলটি পুনরায় লেখার পরে আমার সেশনটি প্রস্থান করি যাতে মেমরির একটি এটি ওভাররাইট না করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.