Eu escrevi um script Bash mscript.sh
para gerenciar meus arquivos de música, uma parte dele cria uma lista desses arquivos.
all_exts=" -iname \"*.webm\" -o -iname \"*.mkv\" "
#all_exts=' -iname "*.webm" -o -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.mkv" '
#The line below works fine
#find "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani" -maxdepth 1 -type f -size +1M \( -iname "*.webm" -o -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.mkv" \)|\
find "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani" -maxdepth 1 -type f -size +1M \( "$all_exts" \)|\
awk -v FS="/" '{print $8}' > "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani/list"
#it does not work with single quotes either
Recebo a seguinte saída:
find: paths must precede expression: -iname "*.webm" -o -iname "*.mkv" '
Quando executo o script sem tentar interpolar all_exts
para meu comando find, o script funciona bem. Como posso expandir corretamente all_exts
? PS Este script é simples apenas para isolar o problema. Eu realmente preciso interpolar all_exts
no comando find porque tenho muitos comandos find fazendo esse trabalho em muitos diretórios diferentes.
Isso ocorre porque – já que você está citando a variável, como deveria – ela é passada como uma única string para
find
. Você pode ver isso comset -x
:Infelizmente, você não pode simplesmente não citá-lo. Primeiro porque isso pode ser perigoso, então é melhor não fazer disso um hábito, e segundo porque não funcionaria aqui de qualquer maneira, já que se você não citar a expressão, o shell irá dividi-la e passá-la como separada
find
, strings citadas:Então, isso procuraria por arquivos nomeados
"foo.webm"
, onde as aspas fazem parte do nome do arquivo. A maneira correta de passar tais argumentos para comandos como uma variável é usar um array e passar o array entre aspas parafind
: