Wenn Sie Ihre Dateinamen zwischen Häkchen setzen, funktioniert das Umgehen von Zeichen mit einem Backslash nicht. Es gibt jedoch eine andere Möglichkeit, dies zu tun. Hier ist eine Zitat-Funktion, die ich in der Vergangenheit verwendet habe und die für Sie nützlich sein könnte.
# # 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 }
Wenn Sie es ausführen, erhalten Sie solche Ausgaben.
$ quote abc abc $ quote "abc'def" 'abc'"'"'def' $ quote \"abc\" '"abc"' $ quote "abc def" 'abc def'
Die Idee hier ist, dass Sie die letzte printf in Ihrem Skript folgendermaßen ersetzen können:
printf "mv %s %s\n" "$(quote "$filename")" "$(quote "$ohne")"
Mit einem Dateinamen von abc'def in Ihrem Skript mit der obigen Änderung habe ich dies als meine Ausgabe erhalten.
mv 'abc'"'"'def' abcdef
und die Datei wurde bei der Ausführung erfolgreich umbenannt.