bashberries

A small set of tiny bash scripts that can do some work for you on GNU/Linux and macOS

View the Project on GitHub

bash berries

bash berries is a set of tiny bash scripts that can do some work for you if you are a Linux admin or a developer on Linux.

Not only scripts are being provided by this project, but also include files that help you to write our own bash scripts more quickly. All bash berries have been tested on the latest stable Ubuntu LTS and macOS releases. If you don’t set any parameters for a script, a short help will be printed.

User website

https://jonelo.github.io/bashberries/

Install or update

bash <(curl -Ls https://bit.ly/update-bashberries) ~/bin

Install or update troubleshooting

Make sure that you have the unzip utility installed and that you can connect to the internet, double check proxy settings if applicable.

Overview of the bash berries

Script name Description
bigfiles Determines the biggest files in a directory and it’s subdirectories
deepgrep Finds text in files recursively
latlng Determines both latitude and longitude of a location
lines Extracts a block of lines from a textfile
m3u8tomp4.sh Converts all .m3u8 files in the current working dir to .mp4
pwned Has your password been pwned?
update_jdk Downloads the latest JDK from the web, extracts it and creates a symlink
update_property Updates the value of a key/value pair in a property file
update_bashberries Downloads all bash scripts from the bashberries project on github
update_tzdatabase Updates the time zone database of your Java Runtime Environment

Overview of the include files

Include name Description
interaction.include provides functions for an user interaction
math.include provides mathematical functions
network.include provides specific network functions
permissions.include provides functions that are related to permissions
proxy.include provides proxy related functions
trim.include provides several trim functions
version.include provides version specific functions

The bash berries in detail

bigfiles

bigfiles v1.1.0, Copyright 2017 Johann N. Loefflmann

Determines the biggest files in a directory and it's subdirectories

Usage:
    bigfiles [-o] [-g greater] [-n max_files] [path]

Options:
    -o           print the owners of the biggest files.
    -g greater   a file is a big file if its file size is greater
                 than the greater value. You may append
                 k, M, G and T for kilo, Mega, Giga, and Tera.
                 If greater is omitted, greater is set to 0.

    -n max_files specifies the maximum number of big files.
                 If max_files is omitted or if max_files is set to 0,
                 all files will be printed that matches -g.

Parameters:
    path         specifies the directory to be traversed.
                 If path is omitted, this help will be printed.

Examples:
    bigfiles -g 1M .
                 all files greater than 1 MB in the current working directory
                 and below.

    bigfiles -o -n 25 -g 1G /
                 25 biggest files > 1 GB in the root directory and below
                 including a summary of the owners of those files.

deepgrep

deepgrep v1.0.0, Copyright 2018 Johann N. Loefflmann

Finds text in files recursively.

Usage:
    deepgrep [-f file filter] [path] <text>

Options:
    -f     file filter

Parameters:
    path   where to search; optional
    text   what to search

Examples:
    deepgrep -f *.mine "Gold"
           searches for "Gold" in all .mine files
           in the current folder and all subfolders

    deepgrep -f *.mine /big/mountain "Gold"
           searches for "Gold" in all *.mine files
           in the /big/mountain folder and all subfolders

latlng

latlng v1.0.0, Copyright 2017 Johann N. Loefflmann

Determines both latitude and longitude of a location.
The script uses the Google Maps web service.

Usage:
    latlng [-c][-i] [location]

Options:
    -c         output as one line separated by a comma
    -i         input in interactive mode

Parameters:
    location   the location as a string

Examples:
    latlng "Statue of Liberty"
               determines lat and lng of the Statue of Liberty
    latlng -ic
               reads input from the user in order to determine lat and lng

lines

lines v1.0.0, Copyright 2017 Johann N. Loefflmann

Extracts a block of lines from a textfile

Usage:
    lines [-i] [-b number] [-e number] [-H number] [-T number]
          [file [begin [end]]]

Options:
    -b number  If begin is a string and if it matches more than one line, you
               can specify a particular match number.
    -e number  If end is a string and if it matches more than one line, you
               can specify a particular match number.
    -i         Ignore case. Perform case insensitie matching. By default,
               the search algorithm is case sensitive.
    -H number  A positive number cuts the head of the output.
               A negative number extends the head of the output.
    -T number  A postivie number extends the tail of the output.
               A negative number cuts the tail of the output.

Parameters:
    file       Specifies the textfile that needs to be processed.
               If file is omitted, this usage will be printed.

    begin      Specifies the search string in order to find the "begin".
               If begin is a string, it searches for the first occurence
               in the file.  If begin is an integer, it specifies a line
               number (starting with 1).

    end        Specifies the search string in order to find the "end".
               If end is a string, it searches for the first occurence
               starting with the line that is specified by "begin".
               If end is an integer, it specifies a line number
               (starting with 1).

Examples:
    lines log.txt 20 40
               Prints line number 20 to line number 40 from the file called
               log.txt

    lines -T -1 verylong.log "^2017-08-06" "^2017-08-07"
               Prints lines from the log file called verylong.log, starting
               with the line that starts with "2017-08-06" and ending with
               the line that starts with "2017-08-07", but not printing out
               that last ending line

m3u8tomp4.sh

no options, no parameters. It just converts all .m3u8 files in the current
working directory to .mp4. It expects the latest ffmpeg binary in the script
dir. It exits if there is an error. In case of success, the .m3u8 will
be removed.

update_jdk

update_jdk v1.20.0, Copyright 2019-2020 Johann N. Loefflmann

Downloads the JRE/JDK from the web, extracts it and creates/updates a symlink
called <type>_latest.
The latest timezone database can be applied to the requested JRE/JDK as well
so that you have the most possible up to date JRE/JDK within a Java family
from your preferred source. And since the symlink always points to the
JRE/JDK you can update the JRE/JDK both fast and comfortable.
Both GNU/Linux and macOS are supported.

Usage:
    update_jdk [ [-h] |
            [-d] [-f] [-k] -s source [-t type] [-z] [-Z location] [path] ]

Options:
    -d      dry run. Don't download the JRE, JDK or tzupdater, just inform the
            user.

    -f      force. Even if we have the JRE, JDK or tzupdater already, update it
            again.

    -h      prints this help.

    -k      keep the downloaded .tar.gz resp. .zip, don't remove it at the end.

    -s      source. The URI should start with http or https and point to a
            .tar.gz file that contains the JRE/JDK binaries. You can find
            JRE/JDK tarballs for example at

            - adoptopenjdk.net
            - azul.com
            - bell-sw.com/java
            - java.com
            - jdk.java.net
            - www.oracle.com/java

    -t      type. The name of the symlink prefix, if not specified, jre is used.

    -v      version. Prints out the version of this script.

    -z      after the JRE or JDK has been downloaded and extracted, the
            latest tzdata will be applied to the JRE or JDK.
            The script expects the tzupdater.jar in the /Users/johann/IdeaProjects/bashberries/bin

    -Z      the timezone files if not from IANA.

Parameters:
    path    specifies the path where the JRE, JDK should be stored.
            It will be created if it doesn't exist.
            If omitted, .<type>/ will be used.

Examples:
    ./update_jdk -s "$ADDRESS"
            downloads the JRE tarball from "$ADDRESS", extracts it, and updates
            the JRE in ./jre/ and it creates a symlink called jre_latest there.
    ./update_jdk -s "$ADDRESS" -z myjres
            updates the JRE in myjres and it updates the symlink called
            jre_latest there. Additionally the timezone updater
            is being called so that the JRE's timezone database also gets updated.
    ./update_jdk -s "$ADDRESS" -t jdk /opt/java/
            updates the JDK in /opt/java/ and it updates a symlink
            called jdk_latest there.
    ./update_jdk -z -s "$ADDRESS" -t openjdk11
            downloads the JDK from "$ADDRESS",
            applies the latest timezone database from IANA to the JDK by calling
            the tzupdater tool. Symlink called openjdk11/openjdk11_latest
            will point to the latest and updated OpenJDK11 build.

update_property

update_property v1.2.0, Copyright 2017,2018 Johann N. Loefflmann

Updates the value of a key/value pair in a property file.
The script saves existing comments and also the order of the properties.

Usage:
    update_property [-d <delimiter>] [-e] [-f] [-q] [file key value]

Options:
    -a      keeps the existing value and appends the new value.
    -d      delimiter, delimits the key and the value.
            If omitted the equal sign is assumed.
    -e      echo the updated line of the file.
    -f      force to append the key/value pair to the file even if the key is
            not in the property file yet.
    -p      keeps the existing value and prepends the new value.
    -q      set quotes around the value when writing the value.

Parameters:
    file    specifies the file that needs to be updated.

    key     specifies the key in the property file.

    value   specifies the value for the key.

Examples:
    update_property -f -q app.conf mykey "new value"
            updates the key called "mykey" with the value called "new value"
            with quotes around the value in the app.conf property file, and
            creates the key/value pair if the key does not exist.
    update_property -d ' ' -e /etc/openvpn/vpn.conf remote "my-server-1 1194"
            updates the key called "remote" in the property file that has
            a blank as the delimiter, it also echoes the modified line.

update_bashberries

update_bashberries v1.2.0, Copyright 2017-2018 Johann N. Loefflmann

Downloads the latest bash scripts from the bashberries project on github
and updates any existing scripts in the directory that has been specified.

Usage:
    update_bashberries [-n] <directory>

Options:
    -n               don't check for a new update_bashberries script

Parameter:
    directory        the directory where the scripts should be stored

Examples:
    ./update_bashberries .
                     updates the bashberries in the current working directory
    bash <(curl -Ls http://bit.ly/update-bashberries) ~/bin
                     updates the bashberries in ~/bin with just this line

update_tzdatabase

update_tzdatabase v1.0.2, Copyright 2017-2018 Johann N. Loefflmann

Downloads the latest timezone data from iana.org, calculates the necessary
sha256 digest by calling jacksum, and updates the timezone database of
your Java Runtime Environment by calling tzupdater.jar

Usage:
    update_tzdatabase [ [-h] |
                        [-j java-binary] [-s jacksum.jar] [-t tzupdater.jar] ]

Options:
    -h               prints this help.
    -j java          location of the java binary.
                     If omitted, default java is used.
    -s jacksum.jar   location of the jacksum.jar file.
                     If omitted, jacksum.jar is expected in the script dir.
    -t tzupdater.jar location of the tzupdater.jar file.
                     If omitted, tzupdater.jar is expected in the script dir.

Examples:
    update_tzdatabase
                     updates the tzdatabase of the default JRE.
    sudo ./update_tzdatabase -j \$(type -P java)
                     updates the tzdatabase of the default JRE using root
                     permissions.