Fiquei com a impressão de que poderia ser mais seguro usar ./*.fastq
ao pesquisar arquivos que terminam com .fastq
. Por exemplo, ./
impediria a captura do arquivo .fastq
. Isso está obviamente errado, como mostra o exemplo abaixo:
TMP_DIR=$(mktemp --directory)
mkdir -p ${TMP_DIR}
(cd ${TMP_DIR}
touch {a,b,c,}.fastq
ls -a
echo ""
echo "# match all:"
for f in *.fastq ; do
echo "${f}"
done
echo ""
echo "# with ./:"
for f in ./*.fastq ; do
echo "${f}"
done
)
rm -rf ${TMP_DIR}
.
..
a.fastq
b.fastq
c.fastq
.fastq
# match all:
a.fastq
b.fastq
c.fastq
# with ./:
./a.fastq
./b.fastq
./c.fastq
Nem *.fastq
nem ./*.fastq
corresponde ao arquivo .fastq
. Então, eu me pergunto agora, há algum ponto em usar ./*.fastq
aqui, ou ./*
em geral?
./*
é que ele garante que os nomes que começam com-
não sejam tratados como opções.Respostas:
Esse é um comportamento curinga inicialmente surpreendente, já que a descrição do
*
caractere curinga diz:... até você perceber que esse período é um pouco especial quando é o primeiro caractere de um nome de arquivo. O texto introdutório
3.5.8 Filename Expansion
diz:O "padrão de uso" de prefixar curingas com
./
é útil para Manipular nomes com traço inicial no shell bash , como comentou o steeldriver. Ele não afeta a expansão de curinga / nome do arquivo, mas torna mais seguro / fácil manipular os nomes de arquivos quando você os consulta, se eles começarem com caracteres que esses programas possam interpretar erroneamente como opções. Por exemplo:... e agora que tenho um arquivo chamado
-n
, se um loop for feito com um curinga:... Não recebo saída!
Mas se eu prefixo o curinga com
./
,... Eu vejo o nome do arquivo.
Este é um exemplo simples para fins de demonstração; veja também Por que printf é melhor que eco? por esse motivo e outros. Outros utilitários serão acionados por outras opções, por isso é melhor apresentar os nomes de arquivos para os utilitários da maneira mais segura possível. Se você não prefixar o curinga para "escapar" dos nomes de arquivos, precisará "proteger" seus utilitários de outras maneiras; um comum é sinalizar o final das opções com
--
, por exemplo:... que passará com segurança o
-n
nome do arquivo paramv
(como visto emset -x
):fonte