BASH:Raplace文件名不在列表中的字符

时间:2015-12-18 13:49:55

标签: regex bash filenames

我想创建一个列表:

0123456789abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVXWYZ-._

然后迭代文件夹中的所有文件,用下划线_替换此列表中不存在的文件名中的每个字符。

包括空格。

但仅使用Bash和GNU工具。

这可能吗?

3 个答案:

答案 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