2016-11-21 71 views
3

创建播放列表时,我经常遇到会破坏播放过程的文件。这将是带有空格或撇号的文件。我会用下面的命令修复它如何删除文件名中的特殊字符?

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

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

也试过rename 's/[^a-zA-Z0-9_-]//' *.mp4但它似乎没有去掉空格或逗号

回答

5

如果添加g修改器你rename会的工作,这将执行所有替换的,而不是只有第一个:

$ 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参数扩展:

  • 对于除a-zA-Z0-9_-从文件名除去一切,假设变量file包含文件名,使用字符类[:alnum:]以匹配当前locale所有的字母和数字:

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

    或明确,改变LC_COLLATEC

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

例子:

$ file='foo bar,spam.egg' 

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

我修改您的代码一点,得到了我所需要的只是它似乎是它留下了一个逗号,并没有将其删除:在* .MP4文件;做mv“$ file”'echo“$ {file // [^ [:alnum:] _-。] /}”'; DONE – Andy

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