I have been trying to batch convert a bunch of really old MS office files to odf formats for archival purposes, using libreoffice from the command line. For this purpose I first gather all the files in a single directory and then invoke the following command (for doc files) within said directory:
/path/to/soffice --headless --convert-to odt *doc
This works well, and the command results in all doc files within the directory being converted in one go. I want to however avoid having to always type out the path to soffice with the necessary parameters, so I added the following to my Bash profile:
alias libreconv='function _libreconv(){ /path/to/soffice --headless --convert-to "$1" "$2"; }; _libreconv'
However, when I now try to invoke the following:
libreconv odt *doc
this results in only the first doc file in the directory being converted, after which the the function exits and returns me to prompt... Maybe I am missing something obvious (I am a cli newb after all), but I do not understand why invoking the function results in only the first file being converted versus all files when I run the soffice command directly.
Thanks in advance for any aid helping me understand what is going wrong here. :)
Because your function only accepts two parameters.
Probably don't hardcode the path to
soffice; instead, make sure yourPATHincludes the directory where it's installed.The alias is completely useless here anyway; see also Why would I create an alias which creates a function?
If you wanted to create a function, try something like
The arguments
"$1"and"$2"literally expand to the first two arguments. The argument"$@"expands to all the arguments, with quoting preserved (this is important if you want to handle file names with spaces in them etc; you see many scripts which incorrectly use"$*"or$@without the quotes).Tangentially, if
sofficeis in a weird place which you don't want in yourPATH, add a symlink to it in a directory which is in yourPATH. A common arrangement is to have~/binand populate it with symlinks to odd binaries, including perhaps scripts of your own which are installed for development in a Git working directory somewhere.A common incantation to have in your
.bash_profileor similar isWith that, you can (create
~/binif it doesn't exist;mkdir ~/bin) andln -s /path/to/soffice ~/binto create a symlink to the real location.