This repository has been archived on 2024-03-04. You can view files and clone it, but cannot push or open issues or pull requests.
linux/document/linux/config/bash/module/name.sh

270 lines
5.3 KiB
Bash
Raw Normal View History

2023-08-08 16:24:15 +03:00
# 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.
2023-10-24 02:40:45 +03:00
new_name=$(echo "$file" | \
2023-10-25 14:40:39 +03:00
sed -e "s/ /_/g" \
-e "s/[^[:alnum:]\._-]//g" \
-e "s/_\+/_/g" \
-e "s/_-_/_/g" \
-e "s/^_\+//"
2023-10-24 02:40:45 +03:00
)
2023-08-08 16:24:15 +03:00
# 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
2023-08-08 16:24:15 +03:00
# 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"
2023-08-08 16:24:15 +03:00
# extract hashes.
stored="${file%%.*}"
actual=$(sha1sum -- "$file" | cut -d\ -f1)
# compare hashes.
if [[ "$stored" = "$actual" ]]; then
echo -e "${status}: OK."
2023-08-08 16:24:15 +03:00
else
echo -e "${color_red}${status}: failed.${color_default}"
((failed++))
2023-08-08 16:24:15 +03:00
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
2023-08-08 16:24:15 +03:00
}
# 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.
2023-10-23 01:00:15 +03:00
export -f name name_hash name_hash_check name_ext