Estou tentando usar find dentro de um loop para criar uma variável que contém um arquivo correspondente ao nome do arquivo + string desejada
Exemplo:
file1.en.srt
file1.mkv
file1.pt.srt
Esta é a parte relevante do código:
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
Funciona se os arquivos não contiverem colchetes, mas os find
comandos não encontrarem nada para arquivos cujos nomes contenham colchetes. Porque isso está acontecendo? Eu quero criar uma variável como $en
essa conteriafile1.en.srt
O problema é que
[
e]
são personagens glob. Por exemplo, considere este arquivo:Ao executar seu script nesse arquivo,
$filename
será:ba[r]
e, portanto, seufind
comando será:Como
[r]
é uma classe de caractere de uma única letra, significar
. Portanto, seu comando está procurando por um nome de arquivo começando comba
, depois umr
, depois qualquer caractere(s)pt-BR.srt
e qualquer caractere novamente. Você precisa escapar dos colchetes:A maneira mais simples de fazer isso é usar
printf
e%q
. Então, basta alterar esta linha:Para isso: