/fix_filename.sh
#!/bin/bash
for ARG in "$@" ; do
# Separate the directory part into DIR.
DIR="${ARG%/*}"
[ "$DIR" = "$ARG" ] && DIR="./"
# Separate the file name part into OLD.
OLD="${ARG##*/}"
# Copy OLD to NEW, replacing everything except
# - . 0-9 A-Z a-z with a single _
# Also make sure NEW starts with 0-9 A-Z a-z
NEW="${OLD//[^-0-9A-Za-z.]/_}"
TMP=""
while [ "$TMP" != "$NEW" ]; do
TMP="$NEW"
NEW="${NEW//__/_}"
NEW="${NEW#[^0-9A-Za-z]}"
NEW="${NEW%[^0-9A-Za-z]}"
done
# No fix necessary?
[ "$OLD" = "$NEW" ] && continue
# Is the new string empty?
if [ -z "$NEW" ]; then
printf '%s: Cannot fix file name.\n' "$ARG" >&2
continue
fi
# Rename file, but ask before overwriting.
mv -i "$DIR/$OLD" "$DIR/$NEW" || exit $?
done
다음과 같이 실행한다.
find /path/to -depth -print0 | xargs -r0 /fix_filename.sh
덧글을 달아 주세요