【问题标题】:How to use linux find command to replace special characters in all file names?如何使用 linux find 命令替换所有文件名中的特殊字符?
【发布时间】:2019-08-25 14:54:35
【问题描述】:

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

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

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

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

【问题讨论】:

标签: bash replace find exec


【解决方案1】:

“mv: target is not a directory”是因为文件名中有空格,可以通过将文件名放在双引号内来修复。

试试这个

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

【讨论】:

  • 用引号括起来 $of 有帮助,但 mv 仍然没有给出字典错误。当同时包含 $if 和 $of 时,它可以工作。谢谢
  • 即使你双引号引用$if,这仍然会遇到包含双引号、美元符号、反引号或反斜杠的文件名,因为这些在原始if="{}" 分配。
【解决方案2】:

您也可以使用 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

【讨论】:

    【解决方案3】:

    效率更高

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

    也确实将这样的 a:bc-_:d 重命名为 'a bc d'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多