You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							100 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							100 lines
						
					
					
						
							1.9 KiB
						
					
					
				#!/bin/sh | 
						|
 | 
						|
# Bulk rename files inside a directory | 
						|
# Depends: | 
						|
 | 
						|
# User-config------------------------------- | 
						|
 | 
						|
# Define editor to open file in | 
						|
set -- emacsclient -a '' | 
						|
 | 
						|
# ------------------------------------------ | 
						|
 | 
						|
format() { | 
						|
	b=$(tput bold) | 
						|
	blue=$(tput setf 1) | 
						|
	n=$(tput sgr0) | 
						|
 | 
						|
	echo "${b}${blue}::${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 | 
						|
prompt=$(format "Proceed with execution? [Y/n]") | 
						|
printf "%s " "$prompt" | 
						|
read -r execute | 
						|
 | 
						|
# Execute file commands | 
						|
if [ "$execute" = "" ] || [ "$execute" = "y" ] || [ "$execute" = "Y" ]; then | 
						|
	format "Executing commands..." | 
						|
	sh "$tmpfile" | 
						|
else | 
						|
	cleanup 1 | 
						|
fi | 
						|
 | 
						|
cleanup
 | 
						|
 |