Rimuovere voci duplicate dalla cronologia di Bash
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 seguente 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 .
python3 "$HOME/scripts/rimuovi_duplicati.py"
# 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 inizialmente 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) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |