我有这个bash脚本
#!/bin/bash
find . -type f > /home/wschrabi/filenames
while read filename; do
stripped="$(printf '%s\n' "$filename" | tr -d -C '[[:alnum:]][[:space:]][!\"\#\$\%\&\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_`{|}~]')";
ohne="$(sed -e 's/[\d126-\d255\"*:<>\?\\\|]/_/g' <<<$filename)";
test "$filename" = "$stripped" || printf "mv '%s' '%s'\n " "${filename//[\']/'\\''}" "${ohne//[\'\"\`]/_}";
done < /home/wschrabi/filenames
在部分${filename//[\']/'\\''}
我想用文件名中的单引号替换。目的应该是当我在bash脚本中输出输出时,我想自动重命名所有文件名。但单引号会产生问题。
非常感谢任何建议。沃尔特
编辑:这是完成我的chekc NTFS for Filename脚本。
#!/bin/bash
#
# Quote a string, wrapping it in tick marks ('), and escaping any
# embedded ticks.
#
# Inputs:
# $1: The string to quote
#
# Returns:
# (stdout) - The quoted string
#
quote() {
if [ $(echo "$@" | tr -d "\n" | wc -c) -eq 0 ]; then
echo "''"
elif [ $(echo "$@" | tr -d "[a-z][A-Z][0-9]:,.=~_/\n-" | wc -c) -gt 0 ]; then
echo "$@" | sed -e "s/'/\'\"\'\"\'/g" | sed -e "s/^/'/g" -e "s/$/'/g"
else
echo "$@"
fi
}
if [ $# -eq 0 ]
then echo "No arguments supplied: USAGE: checkNTFS_filenames.sh <file_to_check>"
fi
if [ $# -eq 1 ]
then
#find . -type f > /home/wschrabi/filenames2
while read filename; do
stripped="$(printf '%s\n' "$filename" | tr -d '\"\*\:\<\>\?\\\|')";
ohne="$(sed -e 's/[\d126-\d255\"*:<>\?\\\|]/_/g' <<<$filename)";
if [ "$filename" != "$stripped" ] ;
then printf "mv %s %s\n" "$(quote "$filename")" "$(quote "$stripped")"
fi
done < $1
fi
我已经添加了另一个答案,不是为了减损virtex,这是正确的,而是指出更短,更有效的方法来做到这一点。就是这样。
—
MariusMatutiae 2016年