2016-11-21 103 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 &