- Bash Scripts -
A list of useful bash scripts I have created
YYYY-MM-DD
- randomstring.sh - 2024-11-09
#!/bin/bash
symbols='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVYXWZ~#$&_+-=/\'
count_symbols="${#symbols}"
if [ -z "$1" ]; then
echo "No length specified.";
else
((length = "$1"))
for i in $(seq 1 "$length") ; do
string+="${symbols:RANDOM % count_symbols:1}"
done
echo "$string" | tr -d '\n' | xsel -i -b # xsel is a dependency, or not if you don't need it
string=""
echo "$length" "RND Character String Was placed in clipboard, have fun :)";
fi
Full credit to Choroba for the very clever method, my implementation is quite lazy in contrast
Usage: ./randomstring.sh *NumberOfCharacters*
What it does: outputs a random string of characters defined by a positional argument to your clipboard.
Note: xsel is a clipboard tool, it can be removed if you want standard output to the terminal.
- fzfdirectorydumper.sh - 2024-09-22
#!/bin/bash filenum="$(find -maxdepth 2 -type f | wc -l)"; finalfilenum="$((filenum-1))"; printf "%s" "$finalfilenum" " Files found."; printf "\nPlease use the Shift+Tab keys to select all files."; sleep 4; clear; fzf="$(fzf -m -q / | tr '\n' ' ')" && mv $fzf "$(pwd)"; cd "$(pwd)";
Usage: Put the script in the directory containing the folders you want to extract the files from, then run
./fzfdirectorydumper.sh
What it does: for every folder, it goes 1 folder depth in to fetch files & moves them into the script directory.
Note: fuzzy finder (fzf) is a dependency. If you have spaces in filenames, use my other script below.
- directorydumper.sh - 2024-11-09
#!/bin/bash
workingdir="$(pwd)" && foldercount="$(ls -l | grep -c "^d")" && movecount="0"
[[ "$foldercount" == 0 ]] && echo "No folders found." || echo "$foldercount" "Folders found. Searching files...";
while [[ "$foldercount" -ne 0 ]]; do
cd "$(ls -d */ | sort -r | cut -f1 -d'/' | sed ""${foldercount}"q;d")";
[[ "$(ls -A)" ]] && mv --backup=numbered * "$workingdir" && ((movecount++))
cd ..; ((foldercount--));
done
[[ ! "$movecount" == 0 ]] && echo "Finished!" && movecount="0" || echo "Your folders don't have any files to transfer!";
Usage: Put the script in the directory containing the folders you want to extract the files from, then run
./directorydumper.sh
What it does: for every folder, it goes 1 folder depth in to fetch files & moves them into the script directory.
Note: This script works with any folder or file with spaces or special characters, go nuts!
If you have duplicate file names, they will have ~NUM~ concatenated to the end to avoid data loss.
When executed, the scope of this script is one directory deep in each folder it finds so it will need to be executed multiple times if your folder hierarchy is like a set of matryoshka dolls.
find "$(pwd)" -maxdepth 100 -type f -exec mv '{}' "$(pwd)" ';' 2>/dev/null
Be VERY careful with the command above!
If you are a freak with a hyper-specific usecase, you can use the bash command above which ignores folders and only moves files to your current working directory. This one-liner may look enticing due to the simplicity but be aware that it performs horribly when compared to my version, I suspect it's because it might cache every file it finds, whereas my version relies on a wildcard which the mv command supports, heavy optimization I suspect.
I compared this bash command on my SSD and HDD, the time difference was of 700 milliseconds when transfering 1.4 gigabytes of data, I suspect the time would get exponentially longer proportional to the amount of data you would transfer. In comparison my version has no discernable difference between storage mediums with an error margin of a few milliseconds, a shame I can't figure out how to not transfer the folders.
This likely goes without saying, please don't run this command anywhere near system-critical directories, there are no fail-safes whatsoever, the same goes with my other transfer scripts.
- webcamviewer.sh - 2024-11-12
#!/bin/bash
videolist="$(ls /dev/ | grep video | wc -l)";
if [[ "$videolist" != "0" ]]; then
echo "Found "$videolist" cam feeds: "$(ls /dev/ | grep video | tr '\n' ' ')"";
for ((i = 1 ; i < "$videolist" + 1; i++ )); do
if [[ -z "$(v4l2-ctl -l --device /dev/"$(ls /dev/ | grep video | tr '\n' ' ' | cut -d " " -f $i)")" ]]; then
printf "$(ls /dev/ | grep video | tr '\n' ' ' | cut -d " " -f "$i") ";
printf "has no controls according to v4l2-ctl, it's probably broken..\n";
fi
done
printf "Which one would you like to try?\nNumber: "; read videochoice
[[ -z "$videochoice" ]] && printf "Using first feed.\n" && videochoice="1"; ((videolist++))
if [[ "$videochoice" =~ ^[0-9]+$ && "$videochoice" -gt 0 && "$videochoice" -lt "$videolist" ]]; then
camfeed="$(ls /dev/ | grep video | tr '\n' ' ' | cut -d " " -f "$videochoice")"
printf "What resolution do you want?\n1. 1920x1080\n2. 1280x720\n3. 640x480\n4. 360x360\n";
printf "Number: "; read rc
case $rc in
1) rc="1920x1080" ;;
2) rc="1280x720" ;;
3) rc="640x480" ;;
4) rc="360x360" ;;
*) rc="1920x1080" && printf "Using biggest resolution.\n" ;;
esac
mpv --demuxer-lavf-o=video_size="$rc",input_format=mjpeg av://v4l2:/dev/"$camfeed" --profile=low-latency
else
printf "Invalid input.\n";
fi
else
printf "No feed found in /dev/\n";
fi
Usage: connect your webcam or camera, then run ./webcamviewer.sh
What it does: checks for video feeds in /dev/ and asks which one to open with mpv and what resolution.
Note: mpv is a dependency, you should tweak the script to your liking if you want to use another viewer.
This script assumes you have v4l2-ctl installed, you can remove the entire for loop if you don't.
- worldbackup.sh - 2024-08-30
#!/bin/bash
i="0"; o="0"; p="0";
# The reasoning behind the sleep commands is to not give the CPU heart attacks by letting the script run loose
# Remember, a path starts with a / and typing a folder name like home/user/Documents/world will NOT work.
echo "- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * -"
echo "| Note: You can type full paths or a folder, but the folder needs |"
echo "| to be in the current/working directory |"
echo "- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * -"
while [ "$p" -eq 0 ]
do
while [ "$i" -eq 0 ]
do
echo "World Not Defined."
sleep 0.5;
while [ "$o" -eq 0 ]
do
printf "%s" "World Folder/Directory: ";
read WorldDirectory
if [ "${WorldDirectory#*"/"}" != "$WorldDirectory" ]; then # POSIX substring parameter expansion
IsWorldDirPath=1; # User entered a path
if test -d "$WorldDirectory"; then
printf "Valid Path :D ";
((o++)) # Ignore loop
else
echo "Invalid Path.. Trying again"
sleep 0.5;
fi
else
IsWorldDirPath=0; # User did not enter a path
if test -d "$WorldDirectory"; then
printf "Valid Folder :D "
((o++)) # Ignore loop
else
echo "Invalid Folder.. Trying again"
sleep 0.5;
fi
fi
done
echo "Using" $WorldDirectory;
sleep 0.5;
((i++)); # Ignore loop
done
((i--)) # Reset state to 0
((o--)) # Reset state to 0
while [ "$i" -eq 0 ]
do
echo "Backup Not Defined."
sleep 0.5;
while [ "$o" -eq 0 ]
do
printf "%s" "Backup Folder/Directory: ";
read BackupDirectory
if [ "${BackupDirectory#*"/"}" != "$BackupDirectory" ]; then
IsBackupDirPath=1; # User entered a path
if test -d "$BackupDirectory"; then
printf "Valid Path :D ";
((o++)) # Ignore loop
else
echo "Invalid Path.. Trying again"
sleep 0.5;
fi
else
IsBackupDirPath=0; # User did not enter a path
if test -d "$BackupDirectory"; then
printf "Valid Folder :D "
((o++)) # Ignore loop
else
echo "Invalid Folder.. Trying again"
sleep 0.5;
fi
fi
done
echo "Using" "$BackupDirectory";
sleep 0.5;
((i++)); # Ignore loop
echo "----------------------------------"
done
echo "$WorldDirectory" "will be copied over to" "$BackupDirectory" "every day with the yyyy-mm-dd format."
echo "Time is according to your locale, using the 12-hour clock with AM PM indicators."
sleep 0.5;
printf "%s" "Sounds Good? : "; read Answer
if [ "$Answer" == "yes" ] || [ "$Answer" == "Yes" ] || [ "$Answer" == "YES" ] || [ "$Answer" == "yeah" ]; then
if [ "$IsWorldDirPath" == 0 ]; then # If not a path
printf "Concatenating World Folder To Form a Path. . . "
FullWorldPath="$(echo "$(pwd)""/"$WorldDirectory)"
sleep 0.5;
if test -d "$FullWorldPath"; then
echo "Success !";
((o++)) # Ignore loop
fi
fi
if [ "$IsBackupDirPath" == 0 ]; then # If not a path
printf "Concatenating Backup Folder To Form a Path. . . "
FullBackupPath="$(echo "$(pwd)""/"$BackupDirectory)"
sleep 0.5;
if test -d "$FullBackupPath"; then
echo "Success !";
((o++)) # Ignore loop
fi
fi
if [ "$IsWorldDirPath" == 1 ]; then # If a path
echo "Valid World Path :D";
FullWorldPath="$WorldDirectory"
((o++)) # Ignore loop
fi
if [ "$IsBackupDirPath" == 1 ]; then # If a path
echo "Valid Backup Path :D";
FullBackupPath="$BackupDirectory"
((o++)) # Ignore loop
fi
((p++)) # Ignore loop
else
echo "Process Interrupted, Trying Again.";
((i--)) # Reset state to 0, Loop continues
((o--)) # Reset state to 0, Loop continues
sleep 0.5;
fi
done
cd "$FullBackupPath"
while :
do
CurrentDate="$(date +"%F_%r" | tr -d " ")";
mkdir "$CurrentDate"
cp -r "$FullWorldPath" "$CurrentDate"
echo "Backup done at: "$CurrentDate"";
sleep 1d
done
Usage: ./worldbackup.sh
What it does: it backups a folder every day, that's fundamentally it.
Note: I used this script before to backup my minecraft server, 90% is error checking before the backup process.
DO NOT run my scripts with elevated privileges, I will beat the shit out of you am not a security expert.