如何使用linux find命令替换所有文件名中的特殊字符?
How to use linux find command to replace special characters in all file names?
我想用 space.
替换所有 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
"mv: target is not a directory"是因为文件名中有空格,可以将文件名放在双引号内解决。
试试这个
find . -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr "()_:-" " " ); mv "$if" "$of" ;' \;
或者你可以使用 sed:
find . -name '*.pdf' sh -c 'mv "[=10=]" "$(sed "s/[-_:()]/ /g" <<< [=10=])"' {} \;
示例文件:
$ 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"`"' \;
也确实将 a:bc-_:d 重命名为 'a bc d'
我想用 space.
替换所有 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
"mv: target is not a directory"是因为文件名中有空格,可以将文件名放在双引号内解决。
试试这个
find . -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr "()_:-" " " ); mv "$if" "$of" ;' \;
或者你可以使用 sed:
find . -name '*.pdf' sh -c 'mv "[=10=]" "$(sed "s/[-_:()]/ /g" <<< [=10=])"' {} \;
示例文件:
$ 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"`"' \;
也确实将 a:bc-_:d 重命名为 'a bc d'