Riyyi
4 years ago
1 changed files with 100 additions and 0 deletions
@ -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 |
Loading…
Reference in new issue