我正在尝试在循环中使用 find 来创建一个变量,该变量包含与文件名 + 所需字符串匹配的文件
例子:
file1.en.srt
file1.mkv
file1.pt.srt
这是代码的相关部分:
shopt -s nullglob
shopt -s nocaseglob
if [ -d "$1" ]; then
for file in "${1%/}/"*mkv; do
# Get filename to match against subs and audios
filename="$(basename "$file" .mkv)"
# Find matching subtitle file
engsubs="$(find . -name "$filename*en.srt*" | sed -e 's,^\./,,')"
# Find matching audio file
engaudio="$(find . -iname "$filename*en.ac3" -o -iname "$filename*en.eac3" -o -iname "$filename*en.dts" | sed -e 's,^\./,,')"
done
fi
如果文件不包含括号,它可以工作,但是find
命令找不到名称包含括号的文件的任何内容。为什么会这样?我想创建一个像$en
这样包含的变量file1.en.srt
问题是
[
并且]
是全局字符。例如,考虑这个文件:在该文件上运行脚本时,
$filename
将为:ba[r]
因此您的find
命令将是:由于
[r]
是单字母字符类,因此意味着r
. 所以你的命令正在寻找一个以 开头的文件名ba
,然后是一个r
,然后是任何字符,然后是pt-BR.srt
任何字符。您需要转义括号:最简单的方法是使用
printf
and%q
。所以只要改变这一行:对此: