Regex 使用execdir和bash查找和替换UNIX

Regex 使用execdir和bash查找和替换UNIX,regex,bash,unix,replace,find,Regex,Bash,Unix,Replace,Find,我是一个新的脚本编写者,需要更改文件中的特殊字符并替换为其他字符 下面是我必须将?替换为的文件名 文件-21041159?74DECL?ARAÃO14581?5904289?6770700.pdf find . -depth -name '*\?*' -type f -execdir bash -c 'mv "$1" "${1/\?/_}"' -- {} \; 结果-21041159_74DECL_ARAÇO14581_5904289_6770700.pdf find . -depth -na

我是一个新的脚本编写者,需要更改文件中的特殊字符并替换为其他字符

下面是我必须将
替换为
的文件名

文件-
21041159?74DECL?ARAÃO14581?5904289?6770700.pdf

find . -depth -name '*\?*' -type f -execdir bash -c 'mv "$1" "${1/\?/_}"' -- {} \;
结果-
21041159_74DECL_ARAÇO14581_5904289_6770700.pdf

find . -depth -name '*\?*' -type f -execdir bash -c 'mv "$1" "${1/\?/_}"' -- {} \;
上面的脚本将第一次出现的问号更改为下划线,但不是从完整的文件名更改为下划线


请建议可以做什么

您的问题的简化版本是:

我可以用
${var/foo/bar}
替换bash变量中第一个出现的字符串

如何替换所有事件

答案是使用双斜杠:
${var//foo/bar}

在这方面,它将是:

find . -depth -name '*\?*' -type f -execdir bash -c 'mv "$1" "${1//\?/_}"' -- {} \;
                                                        # Here --^

看看
rename
命令及其正则表达式功能。为什么要从
-name
选项中去掉通配符?