Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Import bash history to zsh history.
#################################################################
# = This script transfers bash history to zsh history
# = Change bash and zsh history files, if you don't use defaults
#
# = Usage: ruby bash_to_zsh_history.rb
#
# = Author: Ankit Goyal
#################################################################
# change if you don't use default values
BASH_HISTORY_FILE_PATH="#{ENV['HOME']}/.bash_history"
ZSH_HISTORY_FILE_PATH="#{ENV['HOME']}/.zsh_history"
# Read the bash history file
bash_hist_file = File.read(BASH_HISTORY_FILE_PATH)
# Get the list of commands from bash history hile
command_list = bash_hist_file.split("\n")
# Open the zsh history file
zsh_hist_file = File.open(ZSH_HISTORY_FILE_PATH, "a")
# Get timestamp required for zsh history file format and update the history file
time = Time.now.to_i
command_list.each do |command|
time += 1
zsh_hist_file.write(": #{time}:0;#{command}\n")
end
# Close the file
zsh_hist_file.close
@Janitza-AlAt

This comment has been minimized.

Show comment
Hide comment
@Janitza-AlAt

Janitza-AlAt Oct 26, 2016

Thx the script is fast and good

Thx the script is fast and good

@agoree407

This comment has been minimized.

Show comment
Hide comment
@agoree407

agoree407 Nov 1, 2016

Worked phenomenally, thank you!

Worked phenomenally, thank you!

@AmbreB

This comment has been minimized.

Show comment
Hide comment
@AmbreB

AmbreB Dec 1, 2016

Just what I was looking for ! Thank you !!

AmbreB commented Dec 1, 2016

Just what I was looking for ! Thank you !!

@toleabivol

This comment has been minimized.

Show comment
Hide comment

Thanks !

@osahner

This comment has been minimized.

Show comment
Hide comment

osahner commented Mar 16, 2017

Perfect!

@vonHabsi

This comment has been minimized.

Show comment
Hide comment
@vonHabsi

vonHabsi Apr 29, 2017

This command seems to ignore the timestamps in the ~/.bash_history file?

This command seems to ignore the timestamps in the ~/.bash_history file?

@victorhcm

This comment has been minimized.

Show comment
Hide comment
@victorhcm

victorhcm Jun 26, 2017

I'm getting:

zsh: corrupt history file /home/user/.zsh_history

Did anyone else have this issue?

My .bash_history has 23k lines, I think this might be an issue. I tried to increase ZSH history limit and rerun the converter, but still didn't work.

EDIT: Solution:

mv .zsh_history .zsh_history_bad
strings .zsh_history_bad > .zsh_history
fc -R .zsh_history

I tried this, but I think it was before I increased ZSH history limit, so it was mangling my history to 10k lines. From my .zshrc:

HISTSIZE=1000000  # how many lines of history to keep in memory
SAVEHIST=1000000  # how many lines to keep in the history file

victorhcm commented Jun 26, 2017

I'm getting:

zsh: corrupt history file /home/user/.zsh_history

Did anyone else have this issue?

My .bash_history has 23k lines, I think this might be an issue. I tried to increase ZSH history limit and rerun the converter, but still didn't work.

EDIT: Solution:

mv .zsh_history .zsh_history_bad
strings .zsh_history_bad > .zsh_history
fc -R .zsh_history

I tried this, but I think it was before I increased ZSH history limit, so it was mangling my history to 10k lines. From my .zshrc:

HISTSIZE=1000000  # how many lines of history to keep in memory
SAVEHIST=1000000  # how many lines to keep in the history file
@alejoberman

This comment has been minimized.

Show comment
Hide comment
@alejoberman

alejoberman Aug 9, 2017

Works fine and fast! Thank you!

Works fine and fast! Thank you!

@leggiero

This comment has been minimized.

Show comment
Hide comment
@leggiero

leggiero Aug 9, 2017

Awesome script! Worked like a charm. Thank you for sharing!

leggiero commented Aug 9, 2017

Awesome script! Worked like a charm. Thank you for sharing!

@objectuser

This comment has been minimized.

Show comment
Hide comment
@objectuser

objectuser Sep 1, 2017

Thanks! 🥇

Thanks! 🥇

@jjinking

This comment has been minimized.

Show comment
Hide comment
@jjinking

jjinking Nov 24, 2017

Thank you! For anyone else who uses this, if you get utf-8 errors, try upgrading ruby

Thank you! For anyone else who uses this, if you get utf-8 errors, try upgrading ruby

@kietoparao

This comment has been minimized.

Show comment
Hide comment
@kietoparao

kietoparao Apr 8, 2018

Thank you for the script, it worked!

Only thing I had to modify is the time = Time.now.to_i line of your script, because it was giving me future times for the commands transfered from the old ~/.bash_history:

19070* 2018-04-08 15:45  git pull
19071* 2018-04-08 15:45  makepkg -sci    # <--- old .bash_history
19072* 2018-04-08 12:55  bash            # <--- new .zsh_history
19073* 2018-04-08 12:52  echo $SHELL

Just changing it to time = Time.now.to_i - (nr. of lines in old .bash_history) (e.g.: time = Time.now.to_i - 11469) fixed this and now I get the following view with history from zsh:

10534  2018-04-08 12:58  git pull
10535  2018-04-08 12:58  makepkg -sci    # <--- old .bash_history
10536  2018-04-08 13:14  bash            # <--- new .zsh_history
10537  2018-04-08 13:14  echo $SHELL

kietoparao commented Apr 8, 2018

Thank you for the script, it worked!

Only thing I had to modify is the time = Time.now.to_i line of your script, because it was giving me future times for the commands transfered from the old ~/.bash_history:

19070* 2018-04-08 15:45  git pull
19071* 2018-04-08 15:45  makepkg -sci    # <--- old .bash_history
19072* 2018-04-08 12:55  bash            # <--- new .zsh_history
19073* 2018-04-08 12:52  echo $SHELL

Just changing it to time = Time.now.to_i - (nr. of lines in old .bash_history) (e.g.: time = Time.now.to_i - 11469) fixed this and now I get the following view with history from zsh:

10534  2018-04-08 12:58  git pull
10535  2018-04-08 12:58  makepkg -sci    # <--- old .bash_history
10536  2018-04-08 13:14  bash            # <--- new .zsh_history
10537  2018-04-08 13:14  echo $SHELL
@szotsaki

This comment has been minimized.

Show comment
Hide comment
@szotsaki

szotsaki Apr 17, 2018

If you have invalid UTF-8 sequences in your .bash_history, just remove those characters with iconv like

iconv -f UTF-8 -t UTF-8//IGNORE .bash_history > .bash_history-utf8

If you have invalid UTF-8 sequences in your .bash_history, just remove those characters with iconv like

iconv -f UTF-8 -t UTF-8//IGNORE .bash_history > .bash_history-utf8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment