Bulk rename files inside a directory
This commit is contained in:
Executable
+100
@@ -0,0 +1,100 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Bulk rename files inside a directory
|
||||
# Depends:
|
||||
|
||||
# User-config-------------------------------
|
||||
|
||||
# Define editor to open file in
|
||||
set -- emacsclient -a ''
|
||||
|
||||
# ------------------------------------------
|
||||
|
||||
# Output formatting
|
||||
B=$(tput bold)
|
||||
L=$(tput setf 1) # Blue
|
||||
N=$(tput sgr0)
|
||||
|
||||
format() {
|
||||
echo "${B}${L}::${N}${B} ${1}${N}"
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
[ -f "$tmpfile" ] && rm -f "$tmpfile"
|
||||
exit "${1:-0}"
|
||||
}
|
||||
|
||||
signal() {
|
||||
echo
|
||||
cleanup 1
|
||||
}
|
||||
|
||||
# ------------------------------------------
|
||||
|
||||
# Get all filenames in the current directory
|
||||
files=$(find . -maxdepth 1 -type f -printf '%P\n' | sort)
|
||||
|
||||
# Write all filesnames to tmpfile
|
||||
tmpfile=$(mktemp)
|
||||
trap signal HUP INT TERM
|
||||
echo "$files" > "$tmpfile"
|
||||
|
||||
# Open tmpfile in editor, wait to continue
|
||||
md5_before=$(md5sum "$tmpfile")
|
||||
format "Waiting for editor..."
|
||||
"$@" "$tmpfile" > /dev/null
|
||||
md5_after=$(md5sum "$tmpfile")
|
||||
|
||||
# Exit if nothing was changed
|
||||
[ "$md5_before" = "$md5_after" ] && cleanup 1
|
||||
|
||||
# Exit on mismatch entry size
|
||||
lines_before=$(echo "$files" | wc -l)
|
||||
lines_after=$(wc -l "$tmpfile" | cut -d ' ' -f 1)
|
||||
if [ "$lines_before" != "$lines_after" ]; then
|
||||
echo "File amount mismatch!"
|
||||
cleanup 1
|
||||
fi
|
||||
|
||||
# Exit if file has a space
|
||||
if grep -Fq ' ' "$tmpfile"; then
|
||||
echo "Filenames with spaces are not supported!"
|
||||
cleanup 1
|
||||
fi
|
||||
|
||||
# Create file commands
|
||||
i=1
|
||||
for file in $files; do
|
||||
newFile=$(sed -n "${i}p" "$tmpfile")
|
||||
|
||||
if [ "$file" = "$newFile" ]; then
|
||||
command=""
|
||||
else
|
||||
[ -z "$newFile" ] && command="rm -f ${file}" || command="mv ${file} \0"
|
||||
fi
|
||||
|
||||
sed -i "${i}s/.*/${command}/;" "$tmpfile" > /dev/null
|
||||
|
||||
i=$((i+1))
|
||||
done
|
||||
|
||||
# Delete empty lines
|
||||
sed -Ei '/^\s*$/d' "$tmpfile"
|
||||
|
||||
# Display commands
|
||||
prompt=$(cat "$tmpfile")
|
||||
printf "\n%s\n\n" "$prompt"
|
||||
|
||||
# Confirm with user
|
||||
printf "%s " "$(format "Proceed with execution? [Y/n]")"
|
||||
read -r execute
|
||||
|
||||
# Execute file commands
|
||||
if [ "$execute" = "" ] || [ "$execute" = "y" ] || [ "$execute" = "Y" ]; then
|
||||
format "Executing commands..."
|
||||
sh "$tmpfile"
|
||||
else
|
||||
cleanup 1
|
||||
fi
|
||||
|
||||
cleanup
|
||||
Reference in New Issue
Block a user