271 lines
5.5 KiB
Bash
271 lines
5.5 KiB
Bash
# rename files to strip all special characters.
|
|
# usage: name [FILES]
|
|
name()
|
|
{
|
|
local files="$@"
|
|
local count=1
|
|
local total=$#
|
|
|
|
# all files except hidden by default.
|
|
if [[ "$files" = "" ]]; then
|
|
files="[^.]*"
|
|
total=$(ls | wc -l)
|
|
fi
|
|
|
|
# process.
|
|
for file in $files; do
|
|
local new_name
|
|
|
|
# extract new name.
|
|
new_name=$(echo "$file" | \
|
|
sed -e "s/ /_/g" \
|
|
-e "s/[^[:alnum:]\._-]//g" \
|
|
-e "s/_\+/_/g" -e "s/\.\+/\./g" -e "s/-\+/-/g" \
|
|
-e "s/_-/_/g" -e "s/-_/_/g" -e "s/\.-/_/g" -e "s/-\./_/g" -e "s/\._/_/g" -e "s/_\./_/g" \
|
|
-e "s/_\+/_/g" \
|
|
-e "s/^_//" -e "s/_$//"
|
|
)
|
|
|
|
# status line.
|
|
local status="[$count/$total] $file -> $new_name"
|
|
|
|
# check if same name.
|
|
if [[ "$file" = "$new_name" ]]; then
|
|
echo -e "${color_green}$status: no change.${color_default}"
|
|
((count++))
|
|
continue
|
|
fi
|
|
|
|
# check if file name already exists.
|
|
if [[ -f "$new_name" ]]; then
|
|
echo -e "${color_red}$status: already exists!${color_default}"
|
|
return 1
|
|
fi
|
|
|
|
# rename file.
|
|
mv -- "$file" "$new_name" &> /dev/null
|
|
|
|
# show change.
|
|
echo "$status"
|
|
|
|
# increment count.
|
|
((count++))
|
|
done
|
|
}
|
|
|
|
# rename all files to their hashes while keeping extensions.
|
|
# usage: name_hash [FILES]
|
|
name_hash()
|
|
{
|
|
local files="$@"
|
|
local count=1
|
|
local total=$#
|
|
|
|
# all files except hidden by default.
|
|
if [[ "$files" = "" ]]; then
|
|
files="[^.]*"
|
|
total=$(ls -p | grep -v / | wc -l)
|
|
fi
|
|
|
|
# process.
|
|
for file in $files; do
|
|
local extension
|
|
local new_name
|
|
|
|
# process only files.
|
|
if [[ -f "$file" ]]; then
|
|
# extract new name.
|
|
extension="${file##*.}"
|
|
if [ -f "$file" ] && [ "$extension" != "$file" ]; then
|
|
new_name="${file%$extension}"
|
|
else
|
|
new_name="$file"
|
|
extension=""
|
|
fi
|
|
new_name=$(sha1sum -- "$file" | cut -d\ -f1)
|
|
if [[ "$extension" != "" ]]; then
|
|
new_name="${new_name,,}.$extension"
|
|
else
|
|
new_name="${new_name,,}"
|
|
fi
|
|
|
|
# rename file.
|
|
mv -- "$file" "$new_name" &> /dev/null
|
|
|
|
# show change.
|
|
echo "[$count/$total] $file -> $new_name"
|
|
|
|
# increment count.
|
|
((count++))
|
|
fi
|
|
done
|
|
}
|
|
|
|
# check hashes for renamed files.
|
|
# usage: name_hash_check [FILES]
|
|
name_hash_check()
|
|
{
|
|
local stored
|
|
local actual
|
|
local files="$@"
|
|
local count=1
|
|
local total=$#
|
|
local failed=0
|
|
|
|
# all files by default.
|
|
if [[ "$files" = "" ]]; then
|
|
files="[^.]*"
|
|
total=$(ls -p | grep -v / | wc -l)
|
|
fi
|
|
# process.
|
|
for file in $files; do
|
|
# process only files.
|
|
if [[ -f "$file" ]]; then
|
|
# status info.
|
|
local status="[$count/$total] $file"
|
|
|
|
# extract hashes.
|
|
stored="${file%%.*}"
|
|
actual=$(sha1sum -- "$file" | cut -d\ -f1)
|
|
|
|
# compare hashes.
|
|
if [[ "$stored" = "$actual" ]]; then
|
|
echo -e "${status}: OK."
|
|
else
|
|
echo -e "${color_red}${status}: failed.${color_default}"
|
|
((failed++))
|
|
fi
|
|
|
|
# increment count.
|
|
((count++))
|
|
fi
|
|
done
|
|
|
|
# report if any failed.
|
|
if [[ ${failed} -gt 0 ]]; then
|
|
echo -e "${color_bred}Items failed to validate: ${failed}.${color_default}"
|
|
fi
|
|
}
|
|
|
|
# rename files for Jellyfin series, i.e. Episode S01E01.mkv
|
|
# usage: name_series SEASON
|
|
name_series()
|
|
{
|
|
local season="$1"
|
|
local files="${@:2}"
|
|
local count=1
|
|
|
|
# error when no season number specified.
|
|
if [[ "$season" = "" ]]; then
|
|
echo "usage: name_series SEASON"
|
|
return 1
|
|
fi
|
|
|
|
# all files by default.
|
|
if [[ "$files" = "" ]]; then
|
|
files="[^.]*"
|
|
fi
|
|
|
|
# process.
|
|
for file in $files; do
|
|
local new_name
|
|
|
|
# process only files.
|
|
if [[ -f "$file" ]]; then
|
|
# extract new name.
|
|
new_name="Episode S${season}E$(printf %02d $count).${file##*.}"
|
|
|
|
# rename file.
|
|
mv -- "$file" "$new_name" &> /dev/null
|
|
echo "$file -> $new_name"
|
|
|
|
# increment episode number.
|
|
((count++))
|
|
fi
|
|
done
|
|
}
|
|
|
|
# rename files for Kavita manga format.
|
|
# usage: name_manga SEASON
|
|
name_manga()
|
|
{
|
|
local season="$1"
|
|
local files="${@:2}"
|
|
local count=1
|
|
local manga="${PWD##*/}"
|
|
|
|
# error when no season number specified.
|
|
if [[ "$season" = "" ]]; then
|
|
echo "usage: name_manga SEASON"
|
|
return 1
|
|
fi
|
|
|
|
# all files by default.
|
|
if [[ "$files" = "" ]]; then
|
|
files="[^.]*"
|
|
fi
|
|
|
|
# process.
|
|
for file in $files; do
|
|
local new_name
|
|
|
|
# process only files.
|
|
if [[ -f "$file" ]]; then
|
|
# extract new name.
|
|
new_name="${manga} Vol.${season} Ch.${count}.${file##*.}"
|
|
|
|
# rename file.
|
|
mv -- "$file" "$new_name" &> /dev/null
|
|
echo "$file -> $new_name"
|
|
|
|
# increment episode number.
|
|
((count++))
|
|
fi
|
|
done
|
|
}
|
|
|
|
# rename files for new extension.
|
|
# usage: name_ext EXTENSION [FILES]
|
|
name_ext()
|
|
{
|
|
local extension="$1"
|
|
local files="${@:2}"
|
|
local count=1
|
|
local total=$#
|
|
|
|
# error when no new extension specified.
|
|
if [[ "$extension" = "" ]]; then
|
|
echo "usage: name_ext EXTENSION [FILES]"
|
|
return 1
|
|
fi
|
|
|
|
# all files by default.
|
|
if [[ "$files" = "" ]]; then
|
|
files="[^.]*"
|
|
total=$(ls -p | grep -v / | wc -l)
|
|
fi
|
|
|
|
# process.
|
|
for file in $files; do
|
|
local new_name
|
|
|
|
# process only files.
|
|
if [[ -f "$file" ]]; then
|
|
# extract new name.
|
|
new_name="${file%.*}"."$extension"
|
|
|
|
# rename file.
|
|
mv -- "$file" "$new_name" &> /dev/null
|
|
|
|
# show change.
|
|
echo "[$count/$total] $file -> $new_name"
|
|
|
|
# increment count.
|
|
((count++))
|
|
fi
|
|
done
|
|
}
|
|
|
|
# export for parallel.
|
|
export -f name name_hash name_hash_check name_ext
|