我想创建一个列表:
0123456789abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVXWYZ-._
然后迭代文件夹中的所有文件,用下划线_
替换此列表中不存在的文件名中的每个字符。
包括空格。
但仅使用Bash和GNU工具。
这可能吗?
答案 0 :(得分:7)
仅限Bash内幕:
for file in *; do
repl=${file//[!$permitted]/_}
case $file in "$repl") continue;; esac # skip if identical
# Safety: add a suffix to avoid overwriting
while [ -e "$repl" ]; do
repl=${repl}_
done
mv "$file" "$repl"
done
如果$permitted
包含斜杠,则需要反斜杠 - 转义它。
答案 1 :(得分:4)
拥有rename
命令的Perl版本,您可以使用:
rename 's/[^[:alnum:]._-]/_/g' *
答案 2 :(得分:0)
是的,有可能:)
for filename in *; do
newfilename=$(echo "$filename" | sed 's/[^0123456789abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVXWYZ._-]/_/g')
mv "$filename" "$newfilename"
done