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

xhv8bpkk  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(151)

在创建播放列表时,我经常遇到会中断播放过程的文件。例如带有空格或撇号的文件。我会使用以下命令修复它

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

字符串
现在我更经常遇到带有逗号、撇号、括号和其他字符的文件。我该如何修改命令来删除这些字符?
还尝试了rename 's/[^a-zA-Z0-9_-]//' *.mp4,但它似乎没有删除空格或逗号

yqkkidmi

yqkkidmi1#

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

字符串

krugob8w

krugob8w2#

如果你给g添加了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

字符串
您可以单独使用will bash来执行此操作,并扩展参数:

  • 为了从文件名中删除除a-zA-Z0-9_-之外的所有内容,假设变量file包含文件名,使用字符类[:alnum:]匹配当前locale中的所有字母字符和数字:
"${file//[^[:alnum:]_-]/}"


或者显式地将LC_COLLATE更改为C

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

示例:

$ file='foo bar,spam.egg'

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

9wbgstp7

9wbgstp73#

代码也稍微修改了一下。
由于(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,<$as ue,还有西班牙语的和葡萄牙语的<$)。用下划线和连字符替换的问题是,你可以用double结束,三重下划线和underscorehyphenunderscore之类的东西,你可能也想把它们变成一个下划线或连字符。你谈到了mp4,是的,视频文件,字幕文件,所有这些点!让脚本很难轻松操作。
Oh. do. I.[hate]. these. types. off.(x264). files.mp4
更好:
Hm_What_a_Nicely_Convertable_x264_File_I_Have_Here.mp4
它并不完美,仍然是初级的,也许是“遥远的”,需要更多的测试,但似乎工作。
不要笑,plz ;)

相关问题