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

时间:2019-04-04 00:00:58

标签: bash replace find exec

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

我无法执行此操作,因此我只是尝试使用此命令将其删除。

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

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

我希望更改文件名:

    a:bc-de_(fg).pdf

成为

    a bc de  fg .pdf

3 个答案:

答案 0 :(得分:1)

“ mv:目标不是目录”是由于文件名中存在空格,可以通过将文件名放在双引号中进行固定。

尝试一下

.toString

答案 1 :(得分:0)

或者您可以使用sed:

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

示例文件:

$ ls
'a:bc-de_(fg).pdf'  'f:sc-de_(fg).pdf' somefile

输出文件:

$ ls
'a bc de  fg .pdf'  'f sc de  fg .pdf'   somefile

答案 2 :(得分:0)

效率更高

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

也会将a:bc -_:d重命名为'a bc d'