Rimuovere voci duplicate dalla cronologia di Bash

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca

Introduzione

Questo script Python 3 consente di rimuovere automaticamente le voci duplicate della cronologia di Bash; queste voci corrispondono tipicamente alle righe del file ".bash_history" presente nella propria home directory.

Utilizzo

1) Copiare lo script all'interno di un file il cui nome può essere scelto liberamente.
2) Copiare il file appena creato in una directory della propria home directory.
3) Modificare il file ".profile" presente nella propria home directory aggiungendovi le seguenti righe (in rosso):

...
...
# if running bash
if [ -n "$BASH_VERSION" ]; then
   # Esecuzione di uno script Python per eliminare le righe
   # duplicate dal file ~/.bash_history .
   if [ -f "$HOME/scripts/rimuovi_duplicati.py" ]; then
      python3 "$HOME/scripts/rimuovi_duplicati.py"
   fi
   # include .bashrc if it exists
   if [ -f "$HOME/.bashrc" ]; then
       . "$HOME/.bashrc"
   fi
fi
...
...

Notare che in questo caso il file si chiama "rimuovi_duplicati.py" e si trova nella sottodirectory "scripts" all'interno della propria home directory. Adattare entrambi in base alle proprie necessità.

Funzionamento

Lo script viene eseguito ad ogni login dell'utente,
All'interno dello script è presente la variabile "REV" che di default ha il valore "True". Questa variabile determina la riga da mantenere prima che vengano rimosse le altre righe duplicate, nello specifico:

True (valore predefinito)
rimuove le righe duplicate del file lasciando solo l'ultima occorrenza. Ad esempio:
riga5
riga1
riga3
riga1
riga5
riga6
riga7
riga5
diventa:
riga3
riga1
riga6
riga7
riga5
False
rimuove le righe duplicate del file lasciando solo la prima occorrenza. Ad esempio:
riga5
riga1
riga3
riga1
riga5
riga6
riga7
riga5
diventa:
riga5
riga1
riga3
riga6
riga7

Script

#!/bin/python3

'''
Script che rimuove le linee duplicate
all'interno del file ~/.bash_history
'''

from os.path import expanduser
from collections import OrderedDict

HISTORY_FILE = expanduser("~/.bash_history")
REV = True


def load_history_file():
    '''
    Restituisce una lista contenente le righe del file.

    :return: viene restituita una lista i cui elementi sono le righe del
             file contenente la cronologia di Bash, ciascuno termina con '\n'.
    :rtype: list
    '''

    try:
        with open(HISTORY_FILE, "r") as fin:
            return fin.readlines()
    except (OSError, IOError):
        pass


def write_to_history_file(**kwargs):
    '''
    Scrive gli elementi di una lista nel file
    (ogni elemento corrisponde ad una riga).

    :param **kwargs: è gestita solo la chiave lines
    :type **kwargs: dict
    '''

    input_content = kwargs.get("lines")
    if input_content:
        try:
            with open(HISTORY_FILE, "w") as fout:
                content_without_dup = remove_dup(input_content)
                fout.writelines(content_without_dup)
        except (OSError, IOError):
            pass


def remove_dup(mylist):
    '''
    Rimuove i duplicati da una lista

    :param mylist: lista da cui eliminare elementi duplicati
    :type mylist: list
    :return: lista senza duplicati
    :rtype: list

    Variabile REV:
        viene utilizzata nel caso si voglia eliminare i duplicati
        lasciando solo l'ultima occorrenza all'interno del file
        (valore True) o solo la prima (valore False).
    '''

    if REV:
        mylist.reverse()
        templist = list(OrderedDict.fromkeys(mylist))
        templist.reverse()
        return templist
    else:
        return list(OrderedDict.fromkeys(mylist))


def main():
    ''' Main '''
    lines = load_history_file()
    write_to_history_file(lines=lines)

if __name__ == "__main__":
    main()




Guida scritta da: S3v 20:45, 18 mar 2017 (CET) Swirl-auth20.png Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized