【发布时间】:2017-05-23 15:39:35
【问题描述】:
我有一个文件系统,其中包含很多我想在 Windows 机器上使用的文件。文件名中的非法字符是个问题,所以我搜索了一个 bash 命令,它递归地清理所有文件中的非法字符。
我找到了这个解决方案 (https://stackoverflow.com/a/19009177/7394134):
find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x") && mv "$x" "$y" ' \;
它适用于大多数文件,但它不适用于包含双引号的文件并且失败并显示以下错误消息:
bash:(双引号后的文件名的其余部分):找不到命令
我发现了一些稍微不同的问题,例如“删除包含双引号的文件”或“使用 sed 在文件中删除双引号”,但不幸的是,我无法将他们的解决方案转移到成功修改上述命令。
备注:即使可能有更简单的单行代码(我很想看到它们!),我想了解在通过 -exec 将文件名传递给执行的三个命令时的转义重击。是否可以创建一个以这种方式同时删除双引号和单引号的命令?
【问题讨论】: