শেলের শেষ দশটি কমান্ডের ইতিহাস কীভাবে মুছবেন?


131

কমান্ড অনুসরণ

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  history
  519  history -d 511
  520  history

আমি একক দ্বারা মুছে ফেলতে পারি history -d 511, তবে শেলটিতে একক কমান্ড ব্যবহার করে সর্বশেষ 10 কমান্ড এবং 10 কমান্ডের ইতিহাসের মধ্যে কীভাবে মুছবেন?

আমরা কি কোনও বাশ স্ক্রিপ্ট লিখতে এবং ইতিহাস মোছার জন্য কার্যকর করতে পারি?


18
vi $HISTFILEএবং আপনি যা চান তা মুছুন। head -n -10আপনি যদি এটি স্বয়ংক্রিয় করতে হয় ব্যবহার করুন ।
আন্তন কোভালেনকো

এই প্রশ্নটি কি অফ-টপিক ? বা এই ধরণের প্রশ্ন জিজ্ঞাসা করার জায়গাটি ঠিক নয়? যদি তাই হয় তবে আমি এই প্রশ্নটি কোথায় জিজ্ঞাসা করব, আমার মানে স্ট্যাক এক্সচেঞ্জের কোথায়?
জাস্টিন জন

1
আপনি স্থানীয়ভাবে বা এসএসএসের মাধ্যমে লগ ইন হয়ে থাকুন শেল কমান্ডগুলি একই কাজ করে।
বার্মার

2
ইউনিক্স এবং লিনাক্স স্ট্যাকএক্সচেঞ্জ (ইউনিক্স.স্ট্যাকেক্সচেঞ্জ.কম) সম্ভবত এই প্রশ্নের উত্তম ভেন্যু। এটি এখানে অফ-টপিক কারণ এটি প্রোগ্রামিংয়ের সাথে কঠোরভাবে সম্পর্কিত নয়।
ড্যান মোল্ডিং

4
শেল স্ক্রিপ্ট প্রোগ্রামিং করা এই প্রশ্নের আদর্শ সমাধান, ফলস্বরূপ এটি প্রোগ্রামিংয়ের সাথে সম্পর্কিত বিবেচনা করা উচিত। ওপি আসলে একটি স্ক্রিপ্টের জন্য বিশেষভাবে জিজ্ঞাসা করেছিল তা উল্লেখ করার দরকার নেই।
এসএসএইচ এই

উত্তর:


109

আপনি কি সরাসরি ইতিহাসের ফাইল সম্পাদনা করার চেষ্টা করেছেন:

~/.bash_history

2
@ ওহেথেরিসা উইল ওপি একটি ম্যানুয়াল প্লাগ এবং চ্যাগ নয়, একটি স্ক্রিপ্ট চেয়েছিল।
টাইলার Jandreau

10
টার্মিনালটি পুনরায় চালু (বন্ধ ও পুনরায় খোলার) পরে কার্যকর হবে
খালেদ_ভেদেব

8
আপনি যদি ভিএম দিয়ে এটি করেন তবে আপনি আপনার মুছে ফেলার ইতিহাস খুঁজে পেতে পারেন ~/.viminfoতাই এটিও মুছে ফেলার বিষয়ে নিশ্চিত হন!
ওয়ালটউড

5
কখনও কখনও এটি মেমোরিতে রাখা হয় এবং কোনও ম্যানুয়াল সম্পাদনা পরবর্তী লগইনের পরেও চলতে থাকবে না
সুপারহিরো

5
@ ফাইজারখান আমার অর্থ এই যে পরিবর্তনগুলি .bash_historyমেমরিতে রাখা থেকে ওভাররাইট করা যায়। আমি এই সমাধানটি সহায়ক বলে খুঁজে পেয়েছি: superuser.com/a/384383/253543
সুপারহিরো

73

আমার উত্তর পূর্ববর্তী উত্তরের উপর ভিত্তি করে, তবে ক্রমটি উল্টে দেওয়ার সাথে সাথে ইতিহাসের আইটেমগুলি সর্বাধিক সাম্প্রতিক থেকে সাম্প্রতিক সময়ে মুছে ফেলা হবে।

আপনার বর্তমান ইতিহাস পান (আপনি দেখতে চাইছেন এমন লাইনগুলির সংখ্যার সমন্বয় করুন):

history | tail -n 10

এটি আমার মতো কিছু দেয়

1003  25-04-2016 17:54:52 echo "Command 1"
1004  25-04-2016 17:54:54 echo "Command 2"
1005  25-04-2016 17:54:57 echo "Command 3"
1006  25-04-2016 17:54:59 echo "Command 4"
1007  25-04-2016 17:55:01 echo "Command 5"
1008  25-04-2016 17:55:03 echo "Command 6"
1009  25-04-2016 17:55:07 echo "Command 7"
1010  25-04-2016 17:55:09 echo "Command 8"
1011  25-04-2016 17:55:11 echo "Command 9"
1012  25-04-2016 17:55:14 echo "Command 10"

আপনি যে আইটেমগুলি মুছতে চান তার জন্য শুরু এবং শেষের অবস্থানগুলি নির্বাচন করুন। আমি 1006 থেকে 1008 এন্ট্রি মুছতে চলেছি।

for h in $(seq 1006 1008); do history -d 1006; done

এটি history -d1006-র জন্য কমান্ড তৈরি করবে , তারপরে 1007 1006 হয়ে যায় এবং 1006 মুছে ফেলা হয়, তারপরে 1008 (1007 হয়ে গেছে) এখন 1006 এবং মুছে ফেলা হবে।

আমি যদি ইতিহাস মুছে ফেলতে কমান্ডটি মুছতে চাইতাম তবে এটি কিছুটা জটিল কারণ আপনার বর্তমান সর্বাধিক ইতিহাসের এন্ট্রিটি জানতে হবে।

আপনি এটি দিয়ে পেতে পারেন (আরও ভাল উপায় হতে পারে):

history 1 | awk '{print $1}'

এটি একসাথে রেখে আপনি এটি ব্যবহার করতে পারেন কোনও ব্যাপ্তি মুছতে, এবং ইতিহাস মুছার আদেশটি মুছতে:

for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')

আপনার এতে যুক্ত করতে একটি ফাংশনে এগুলি সমস্ত গুটিয়ে নিন ~/.bashrc:

histdel(){
  for h in $(seq $1 $2); do
    history -d $1
  done
  history -d $(history 1 | awk '{print $1}')
  }

4, 5 এবং 6 (1049-1051) কমান্ড মুছে ফেলা এবং প্রমাণ লুকিয়ে রাখার উদাহরণ:

[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:51 echo "Command 4"
 1050  25-04-2016 18:20:53 echo "Command 5"
 1051  25-04-2016 18:20:54 echo "Command 6"
 1052  25-04-2016 18:20:56 echo "Command 7"
 1053  25-04-2016 18:20:57 echo "Command 8"
 1054  25-04-2016 18:21:00 echo "Command 9"
 1055  25-04-2016 18:21:02 echo "Command 10"
 1056  25-04-2016 18:21:07 history 11
[18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:56 echo "Command 7"
 1050  25-04-2016 18:20:57 echo "Command 8"
 1051  25-04-2016 18:21:00 echo "Command 9"
 1052  25-04-2016 18:21:02 echo "Command 10"
 1053  25-04-2016 18:21:07 history 11

প্রশ্নটি আসলে ইতিহাস থেকে শেষ 10 টি কমান্ড মুছে ফেলার ছিল, তাই আপনি যদি কিছুটা প্রচেষ্টা সংরক্ষণ করতে চান তবে আপনি অন্য ফাংশনটি ফাংশনটি কল করতে ব্যবহার করতে পারেন histdelযা আপনার জন্য গণনা করে।

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

এই ফাংশনটিতে 1 টি যুক্তি লাগে, মুছতে পূর্ববর্তী ইতিহাসের আইটেমের সংখ্যা। সুতরাং ইতিহাস থেকে শেষ 10 কমান্ড মুছতে কেবল ব্যবহার করুন histdeln 10


history | tail -1 | awk '{print $1}'সরলীকৃত করা যেতে পারেhistory 1 | awk '{print $1}'
জর্জ হিলিয়ার্ড

-bash: tac: command not foundম্যাক ওএসএক্স এ, অন্যথায় এটি সেরা উত্তর হবে।
জিম

for h in $(seq 1006 1008); do history -d 1006; doneএটি উবুন্টু 16.04
মাহফুজ

সংক্ষিপ্ত তবে মিষ্টি:for i in {1..10}; do history -d $(($HISTCMD-11)); done
কিমি

30
for x in `seq $1 $2`
do
  history -d $1
done

3
প্রথম আর্গুমেন্টের জন্য উচ্চতর নম্বরটি ব্যবহার করার বিষয়ে নিশ্চিত হন বা আপনি অন্য প্রতিটি কমান্ড মুছবেন। উদাহরণস্বরূপ, যখন কমান্ড 511 মুছে ফেলা হবে তখন সমস্ত কিছু শিফট হয়ে যায় সুতরাং 512 নতুন 511 হয়ে যায় এবং 513 নতুন 512 হয় for সুতরাং history -d 511প্রত্যাশার মতো কাজ করে, তারপরে history -d 512513 হিসাবে ব্যবহৃতটি মুছে ফেলবে, এবং 512 কমান্ড 511 হিসাবে ইতিহাসে রয়ে গেছে that আশাবাদটি উপলব্ধি করে? ।
ম্যাথু

5
@ ম্যাথহে এটি প্রয়োজনীয় নয়। আমি $xপ্রতিবার লুপটি মুছে ফেলছি না, মুছে ফেলছি $1। সুতরাং এটি প্রথমে 511 মুছে দেয় এবং 512 511 হয়ে যায় Then তারপরে এটি আবার 511 মুছে দেয় এবং আরও অনেক কিছু।
বার্মার

@ ম্যাথিউ লক্ষ করুন যে আমি টাইলারের উত্তরের অনুরূপ মন্তব্য করেছি। আমি এর সমাধান হিসাবে আমার সমাধান নিয়ে এসেছি।
বার্মার

আপনি ঠিক বলেছেন, আমার তাড়াহুড়োয় যখন আমার ব্যাশ প্রম্পটে আমি একটি লাইনে এটি লিখেছিলাম for i in... এবং history -d $iআমি আমার মন্তব্যে বর্ণিত ফলাফল পেয়েছি। আপনার মূল উত্তরে বর্ণিত হিসাবে $ 1 এ একেবারে সঠিক correct
ম্যাথু

18

প্রথমে, টাইপ করুন: historyএবং আপনি মুছে ফেলতে চান এমন লাইন নম্বরগুলির ক্রমটি লিখুন।

লাইনটি 1800 থেকে 1815 বলতে লাইনগুলি সাফ করার জন্য টার্মিনালে নিম্নলিখিতটি লিখুন:

$ for line in $(seq 1800 1815) ; do history -d 1800; done

আপনি যদি মুছে ফেলা কমান্ডের জন্য ইতিহাসটি মুছতে চান, 1815 = 1816 এর জন্য +1 যোগ করুন এবং সেই অনুক্রমের জন্য ইতিহাস + মুছে ফেলা আদেশটি মুছে ফেলা হবে।

উদাহরণ স্বরূপ :

$ for line in $(seq 1800 1816) ; do history -d 1800; done

আমি একটি আপডেট করেছি তবে এখনও উবুন্টু 12.04 এ সঠিকভাবে কাজ করছি না .. :( দেখে মনে হচ্ছে লাইন নম্বর অংশটি
ঠিকভাবে

আমি বিনোদ এর প্রস্তাবিত সম্পাদনাটিকে প্রত্যাখ্যান করেছি কারণ এটি কোনও যৌক্তিক ত্রুটি নয়। ঘাসানের আসল কোড বারমারের উত্তর হিসাবে একই পদ্ধতির ব্যবহার করে - যা কাজ করে। বারমারের উত্তরের মন্তব্যে ব্যাখ্যা করা হয়েছে যে কেন 1800 প্রতিস্থাপনের পরামর্শটি অন্য প্রতিটি লাইন$line মুছে ফেলে এবং তারপরে কাঙ্ক্ষিত সীমাটি ছাড়িয়ে যায়।
অ্যান্টনি জিওগেইগান

18

বাশ 5 এর সাহায্যে আপনি এখন একটি ব্যাপ্তি করতে পারেন ... হুর !:

history -d 511-520

বা পিছনে 10 গণনা:

history -d -10--1

বাশ 5 ম্যান পৃষ্ঠা থেকে উদ্ধৃতি :

'ইতিহাস'

সরবরাহগুলি সরবরাহ করা হলে নিম্নলিখিত অর্থগুলি থাকে:

'-ডি অফসেট' অফসেটে অবস্থানের ইতিহাসের এন্ট্রি মুছুন। যদি অফসেটটি ইতিবাচক হয় তবে ইতিহাস প্রদর্শিত হবে হিসাবে এটি প্রদর্শিত হবে। যদি অফসেটটি নেতিবাচক হয় তবে এটি শেষের ইতিহাসের অবস্থানের তুলনায় বৃহত্তর তুলনায় ব্যাখ্যা করা হয়, সুতরাং নেতিবাচক সূচকগুলি ইতিহাসের শেষ থেকে গণনা করে, এবং '-1' এর সূচকটি বর্তমান 'ইতিহাস-ডি' কমান্ডকে বোঝায়।

'-d START-END' সমাপ্তি সহ START ও END পজিশনের মধ্যে ইতিহাসের এন্ট্রি মুছুন। START এবং END এর জন্য ইতিবাচক এবং নেতিবাচক মানগুলি উপরে বর্ণিত হিসাবে ব্যাখ্যা করা হয়েছে।

বাশ ৪-এর জন্য আমার সমাধানটি এখানে ite

delHistory () {
    count=$(( ${2:-$1} - $1 ))
    while [[ $count -ge 0 ]]; do
        history -d "$1"
        ((count--))
    done
}

delHistory 511 520


9

সম্পাদনা:

বক্রযুক্ত পুনরাবৃত্তির পরিবর্তিত হয়েছে, ভাল কল। এছাড়াও, এই ফাংশনটি একটি বিপরীত পুনরুক্তি দিয়ে কল করুন।

আপনি সম্ভবত এটির মতো কিছু করতে পারেন:

#!/bin/bash
HISTFILE=~/.bash_history   # if you are running it in a 
                           # non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
    history -d $i
done
history -w

আপনি যেখানে এইভাবে উঠবেন:

./nameOfYourScript 563 514

লক্ষ্য করুন আমি সীমা পরীক্ষা করতে কোনও ত্রুটি রাখি নি put আমি এটি পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে দেব।

আরো দেখুন এই প্রশ্নের


6
আপনি 510 মুছে ফেলার পরে 511 510 হয়ে যায়, 512 511 হয়ে যায় ইত্যাদি। সুতরাং এটি প্রতিটি অন্যান্য লাইন মুছে ফেলবে।
বার্মার

আপনি ব্রেস বিস্তারে ভেরিয়েবলগুলি অন্তর্ভুক্ত করতে পারবেন না।
চিপনার

seq 563 514কিছুই প্রিন্ট করা হবে। আপনি প্রয়োজন seq 563 -1 514। পর্যায়ক্রমে, আপনি কেবল history -d $1যুক্তি দিয়ে যেমন ব্যবহার করতে পারেন514 563
আনিশন

9

কারও পক্ষে উপকারী হতে পারে।
আপনি যখন আপনার বর্তমান সেশনের কোনও কনসোল / টার্মিনাল ইতিহাসের কোনও ব্যবহারকারীর সাথে লগইন করেন কেবল তখন কিছু "বাফার" উপস্থিত থাকে যা আপনার লগআউটটিতে ~ / .bash_history এ প্রবাহিত হয়।
সুতরাং, জিনিসগুলি গোপন রাখতে আপনি কেবল পারেন:
history -r && exit
এবং আপনার সমস্ত সেশনের (এবং কেবল) ইতিহাস সাফ হয়ে লগ আউট করা হবে;)


5

কমান্ডের ইতিহাসের ট্রেসটি মুছতে আমি এই থ্রেডে ভাগ করা সমাধানগুলির সংমিশ্রণটি ব্যবহার করেছি। প্রথমত, আমি যাচাই করেছি কমান্ডের ইতিহাসটি এর সাথে সংরক্ষণ করা হয়েছে:

echo $HISTFILE

আমি এর সাথে ইতিহাস সম্পাদনা করেছি:

vi <pathToFile>

এর পরে, আমি বর্তমান সেশন ইতিহাসের বাফারটি এর সাথে ফ্লাশ করছি:

history -r && exit

পরের বার আপনি এই অধিবেশনটিতে প্রবেশ করার পরে, কমান্ডের ইতিহাসে আপনি যে সর্বশেষ আদেশটি দেখবেন তা হ'ল আপনি পাথটোফাইলে রেখে গেছেন


এটি আমার পক্ষে কাজ করে, @jgc এর উত্তরের জন্য, যখন আমি আবার সার্ভারে লগইন করি, ইতিহাস আবার ফিরে আসে, কেবল সেই লগইন সেশনের জন্যই কাজ করে
যোগেশ্বর তানওয়ার


1

সর্বশেষ 10 টি এন্ট্রি মুছতে (আপনার উদাহরণের ভিত্তিতে):

history -d 511 520

1
জিএনইউ বাশ-এ, সংস্করণ 4.3.11 (1) এটি কেবল তালিকার প্রথম লাইনটি মুছে ফেলে
গ্যারি

1

আমি ইতিহাসের শেষ 10 টি কমান্ড মুছতে এই স্ক্রিপ্টটি ব্যবহার করি:

pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done

এটি $HISTCMDইতিহাস সূচী পেতে পরিবেশগত রূপ ব্যবহার করে এবং সর্বশেষ 10 টি প্রবেশকেন্দ্র মোছার জন্য এটি ব্যবহার করে history


1

নিম্নলিখিত চেষ্টা করুন:

for i in {511..520}; do history -d $i; echo "history -d $i"; done

ধরে নেওয়া হয় তিনি ইতিমধ্যে ইতিহাস তালিকাভুক্ত করেছেন এবং সমস্ত আইডি আগেই জানে
মার্কোর্ন

এবং এটি ইতিহাসের তালিকার
সর্বশেষতম

এটি অবশ্যই হবে:for i in {511..520}; do history -d $i; echo "history -d 511"; done
devwebcl

1

আমি এটি ব্যবহার করি (আমার বাশ 4 আছে):

histrm() {
    local num=${1:- 1}
    builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
    (( num-- )) && $FUNCNAME $num
    builtin history -w
}

builtin historyঅংশের পাশাপাশি গত যেমন -wকারণ আমি জায়গা বিখ্যাত একটি প্রকরণ আছে টার্মিনাল জুড়ে ভাগ ইতিহাস ঠাট এবং এই ফাংশন ঐ অংশের ছাড়া ভঙ্গ করবে। তারা প্রকৃত বাশ historyবিল্টিনে (এবং তার চারপাশে আমার নিজের র‍্যাপারের কাছে নয়) এবং এন্ট্রিগুলি সরিয়ে ফেলার পরে ইতিহাসটি HISFILE- এ লিখতে নিশ্চিত করে।

তবে এটি "স্বাভাবিক" ইতিহাসের কনফিগারেশনের মতোই কাজ করবে।

আপনি মুছে ফেলতে চান এমন শেষ প্রবেশের সংখ্যার সাথে এটি কল করা উচিত, উদাহরণস্বরূপ:

histrm 10

শেষ 10 টি এন্ট্রি সরিয়ে ফেলবে।


1
history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;

নিষ্ঠুর কিন্তু কার্যক্ষম


0
for h in $(seq $(history | tail -1 | awk '{print $1-N}')  $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')

আপনি যদি 10 টি লাইন মুছতে চান তবে কেবল N এর মান 10 করে দিন।


0

একটি সাধারণ ফাংশন সমস্ত সংখ্যায় মেরে ফেলতে পারে (যদিও এটি ত্রুটিগুলিতে বারফ করে)

kill_hist() {
    for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
    do
            history -d $i;
    done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`

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