如何在文件名中删除特殊字符?

10

在创建播放列表时,我经常遇到会破坏播放过程的文件。这些文件可能包含空格或撇号。我会使用以下命令来修复它

for file in *.; do mv "$file" `echo $file | tr " " '_'` ; done **(for spaces)**

现在我经常遇到带逗号,撇号,括号和其他字符的文件。我该如何修改命令以删除这些字符?

我也尝试过 rename 's/[^a-zA-Z0-9_-]//' *.mp4 但它似乎无法去除空格或逗号。

3个回答

16
for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done &

9

如果你在rename中添加g修饰符,它就可以正常工作了。这个修饰符会执行所有的替换而不仅仅是第一个:

$ echo "$file"
foo bar,spam.egg

$ rename -n 's/[^a-zA-Z0-9_-]//' "$file"
foo bar,spam.egg renamed as foobar,spam.egg

$ rename -n 's/[^a-zA-Z0-9_-]//g' "$file"
foo bar,spam.egg renamed as foobarspamegg

您可以仅使用bash和参数扩展来完成此操作:

  • For removing everything except a-zA-Z0-9_- from file names, assuming variable file contains the filename, using character class [:alnum:] to match all alphabetic characters and digits from current locale:

    "${file//[^[:alnum:]_-]/}"
    

    or explicitly, change the LC_COLLATE to C:

    "${file//[^a-zA-Z0-9_-]/}"
    

例子:

$ file='foo bar,spam.egg'

$ echo "${file//[^[:alnum:]_-]/}"
foobarspamegg

我稍微修改了你的代码,得到了我需要的结果,但似乎它留下了一个逗号并没有删除它:for file in *.mp4; do mv "$file" echo "${file//[^[:alnum:]_-.]/}" ; done - Andy

0
稍微修改了一下代码。
由于(indir)替换,也就是文件名的净化,可能会变得复杂,我暂时想到了这个解决方案:
for FILE in *
do
FN=${FILE%.*} # file name without extension
FE=${FILE#$FN.} # extension without dot in front
SUBSTITUTE="s/[^A-Za-z0-9._-]/_/g;s/[.]/_/g;s/[ ]/_/g;s/____|___|__|___-___|__-__|_-_|___--___|__--__|_--_/_/g;s/____$|__$|_$//g;s/é|è|ë|ê/e/g;s/à|á|ä|â|ã/a/g;s/ó|ò|ô|õ/o/g;s/ö/oe/g;s/ù|û|ú/u/g;s/ü/ue/g;s/ñ/n/g;s/í|ì|î|ï/i/g;s/ç/c/g"

if [[ "${FE}" != "sh" ]]
then

  if [[ "${FILE}" == "${FN}.${FE}" ]]
  then
  mv "${FILE}" $(echo "${FN}" | sed -r "${SUBSTITUTE}").${FE}
  
  else
  mv "${FILE}" $(echo "${FILE}" | sed -r "${SUBSTITUTE}")
  fi
   
fi
done

它不包括可适应的shell脚本。 因此,它在目录中寻找带有和不带扩展名的文件。 大多数特殊字符被排除在外,重音字母默认替换为普通字母(德语的ö通常写作oe,ü写作ue,还有西班牙语的ñ和葡萄牙语的ã等)。 替换为下划线和连字符的问题是,你可能会得到双重、三重下划线,以及像下划线连字符下划线这样的东西,你可能希望将其转换为单个下划线或连字符。 你提到了mp4和视频文件,字幕文件,它们中间有那么多的点!这让脚本编写者很难进行简单的操作。

Oh.do.I.[hate].these.types.off.(x264).files.mp4

更好:

Hm_What_a_Nicely_Convertable_x264_File_I_Have_Here.mp4

这还不够完美,还很基础,或许有些“牵强”,需要更多的测试,但似乎能够运行。
请不要笑哦 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接