Bash 如何使用LinuxFind命令替换所有文件名中的特殊字符?

Bash 如何使用LinuxFind命令替换所有文件名中的特殊字符?,bash,replace,find,exec,Bash,Replace,Find,Exec,我想用空格替换所有pdf文件名中的所有特殊字符(即?:/)(\-\n\t) 我无法做到这一点,所以我只是尝试使用此命令删除它们 出于某些原因,该命令有时适用于测试用例,但不适用于其他测试用例。它给出错误mv:target不是目录,并且输入文件和目标文件的名称相同(如果没有要删除的特殊字符) 我希望更改文件名: a:bc-de_(fg).pdf 将来 “mv:target不是目录”是因为文件名中有空格,可以通过将文件名放在双引号内来修复 试试这个 find . -name '*.pdf

我想用空格替换所有pdf文件名中的所有特殊字符
(即?:/)(\-\n\t)

我无法做到这一点,所以我只是尝试使用此命令删除它们

出于某些原因,该命令有时适用于测试用例,但不适用于其他测试用例。它给出错误mv:target不是目录,并且输入文件和目标文件的名称相同(如果没有要删除的特殊字符)

我希望更改文件名:

    a:bc-de_(fg).pdf
将来

“mv:target不是目录”是因为文件名中有空格,可以通过将文件名放在双引号内来修复

试试这个

find .  -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr "()_:-" " " ); mv "$if" "$of" ;' \;

或者,您可以使用sed:

find . -name '*.pdf' sh -c 'mv "$0" "$(sed "s/[-_:()]/ /g" <<< $0)"' {} \;
输出文件:

$ ls
'a bc de  fg .pdf'  'f sc de  fg .pdf'   somefile
只是效率更高

find ~+ -regextype awk -iregex '.*/[^/]*[-_:()\t][^/]*\.pdf' -exec sh -c 'mv "{}" "`echo "{}"|sed -E "s/[-_:\(\)\t]+/ /g"`"' \;

也确实将这样的:bc-uU;:d重命名为“a bc d”

用引号括起$of有帮助,但mv仍然没有给出字典错误。当同时包含$if和$of时,它可以工作。如果对
$if
进行双引号引用,则包含双引号、美元符号、反勾号或反斜杠的文件名仍会有问题,因为这些在原始
if=“{}”
赋值中不安全。请参阅和。
$ ls
'a:bc-de_(fg).pdf'  'f:sc-de_(fg).pdf' somefile
$ ls
'a bc de  fg .pdf'  'f sc de  fg .pdf'   somefile
find ~+ -regextype awk -iregex '.*/[^/]*[-_:()\t][^/]*\.pdf' -exec sh -c 'mv "{}" "`echo "{}"|sed -E "s/[-_:\(\)\t]+/ /g"`"' \;