Você pode usar o curinga *
para o nome que não conhece. Digamos que você defina
FILE=../"$1"/*.txt
A expansão de curingas ocorre apenas fora das cotações. A variável $FILE
ainda tem o asterisco. Então,
[ -f "$FILE" ]
é equivalente a
[ -f "../test/*.txt" ]
que quer um asterisco literal no nome do arquivo, mas
[ -f $FILE ]
é equivalente a
[ -f ../test/*.txt ]
que é expandido.
É um pouco perigoso usar $FILE
para manter um padrão: se seu "$1"
contiver um espaço, você não poderá fazê-lo funcionar entre aspas ou sem aspas: ele manterá o espaço, mas asterisco também, mas sem aspas vai se dividir no espaço. Você poderia jogar com IFS
, mas, neste caso, uma variável intermediária não é a melhor ideia, de qualquer forma.
As pessoas vão se encolher com esse hack, mas se não tiver nomes de arquivos patológicos, funcionará. O que você pode fazer é forçar a expansão do nome de arquivo antes de salvá-lo na variável.
FILE="$(echo ../"$1"/*.txt)"
Agora, o asterisco é substituído pelo nome do arquivo real e, mais tarde, você pode usar com segurança a versão com aspas "$FILE"
para proteger espaços, mas o asterisco desapareceu.
Isso falhará se não houver nenhum arquivo com esse nome, o asterisco será mantido como literal (a menos que você defina a opção nullglob
bash). E se houver mais de um arquivo txt, isso também não funcionará corretamente. No entanto, isso sempre funcionará
for FILE in ../"$1"/*.txt; do whatever you want to do with '"$FILE"'; done