在创建播放列表时,我经常遇到会破坏播放过程的文件。这些文件可能包含空格或撇号。我会使用以下命令来修复它
for file in *.; do mv "$file" `echo $file | tr " " '_'` ; done **(for spaces)**
现在我经常遇到带逗号,撇号,括号和其他字符的文件。我该如何修改命令以删除这些字符?
我也尝试过 rename 's/[^a-zA-Z0-9_-]//' *.mp4
但它似乎无法去除空格或逗号。
for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done &
如果你在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 *
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
这还不够完美,还很基础,或许有些“牵强”,需要更多的测试,但似乎能够运行。
echo "${file//[^[:alnum:]_-.]/}"
; done - Andy