From 5e997ee834aafee7bdb6c8fb0bad54702c75580b Mon Sep 17 00:00:00 2001 From: Chris Koeritz Date: Thu, 17 Sep 2015 13:05:02 -0400 Subject: [PATCH] improved spacem method to handle unwritable names better (where perl was not happy renaming a file that contained a pipe character). now weird character replacement happens before the lower-casing, so it works a lot better. --- scripts/core/functions.sh | 31 ++++++++++++------- .../files/replace_spaces_with_underscores.sh | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/scripts/core/functions.sh b/scripts/core/functions.sh index 553e100f..912f545a 100644 --- a/scripts/core/functions.sh +++ b/scripts/core/functions.sh @@ -470,21 +470,28 @@ if [ -z "$skip_all" ]; then echo "failure to find a file or directory named '$arg'." continue fi + + # first we will capture the output of the character replacement operation for reporting. + # this is done first since some filenames can't be properly renamed in perl (e.g. if they + # have pipe characters apparently). + intermediate_name="$(bash "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg")" + if [ -z "$intermediate_name" ]; then + # make sure we report something, if there are no further name changes. + intermediate_name="'$arg'" + else + # now zap the first part of the name off (since original name isn't needed). + intermediate_name="$(echo $intermediate_name | sed -e 's/.*=> //')" + fi + # first we rename the file to be lower case. - perl $FEISTY_MEOW_SCRIPTS/files/renlower.pl "$arg" &>/dev/null - # oops, now the name is all lower-case. we need to make the - # same adjustment. - arg2="$(echo "$arg" | tr A-Z a-z)" - # we definitely wanted to adjust the case first, rather than doing all - # the wacky stuff this script does to the filename... we will capture - # the output of the replace operaton for reporting. - final_name="$(bash "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg2")" + actual_file="$(echo $intermediate_name | sed -e "s/'\([^']*\)'/\1/")" + final_name="$(perl $FEISTY_MEOW_SCRIPTS/files/renlower.pl "$actual_file")" if [ -z "$final_name" ]; then - # make sure we report something, if there are no further name changes. - final_name="'$arg2'" + final_name="'$intermediate_name'" + else + final_name="$(echo $final_name | sed -e 's/.*=> //')" fi - # now zap the intermediate part of the name off. - final_name="$(echo $final_name | sed -e 's/.*=> //')" + # printout the combined operation results. echo "'$arg' => $final_name" done diff --git a/scripts/files/replace_spaces_with_underscores.sh b/scripts/files/replace_spaces_with_underscores.sh index a26371d4..3cbcfa89 100644 --- a/scripts/files/replace_spaces_with_underscores.sh +++ b/scripts/files/replace_spaces_with_underscores.sh @@ -16,7 +16,7 @@ while [ $# -gt 0 ]; do # in names. then translate multiple underscores into just one. then turn # number followed by underscore into just number (?). then translate # underscore dash underscore into just dash. - newname="$(echo "$file" | tr -s ' ' '_' | tr -d "\$\!@&#%}{)(][\\\~',:?><\"" | sed -e 's/__/_/g' | sed -e 's/\([0-9]\)_\./\1./g' | sed -e 's/_-_/-/' )" + newname="$(echo "$file" | tr -s ' ' '_' | tr -d "\$\!|@&#%}{)(][\\\~',:?><\"" | sed -e 's/__/_/g' | sed -e 's/\([0-9]\)_\./\1./g' | sed -e 's/_-_/-/' )" if [ "$file" != "$newname" ]; then # we've effected a name change, so let's actually do it. echo "'$file' => '$newname'" -- 2.34.1