Como mencionado, o find
geralmente é a ferramenta correta ao manipular arquivos. No entanto, pode ser perfeitamente OK.
Você pode pular esta parte do printf
, se quiser, apenas incluí-lo como um bônus : P
Uma coisa que você também pode começar a usar é printf
. Geralmente, é uma opção melhor do que echo
. Na sua forma mais simples você tem:
printf "Some text\n"
em que \n
é nova linha. Se você quiser imprimir alguma variável você pode usar o símbolo especial %s
(para string):
printf "Name is %s \n" "$name"
| |
| +---- value
+---------------- format string
printf "Name is %s city is %s \n" "$name" "$city"
| | |
| +-------+----- values
+------------------------------------ format string
Existem outros símbolos que você pode usar, como %d
(para dígito). Você também pode usar outros caracteres especiais, como \t
(guia).
Para o seu código, geralmente é melhor usar o mais recente $(cmd)
em vez de '' cmd '. Em seu código isso seria:
$(ls *.txt)
A próxima coisa a observar é o loop for
. Sua declaração
for n in 'ls *.txt'; do
não faz o que você pensa. Aqui n
é tratado como um nome de variável ao qual o resultado de ls *.txt
é atribuído. Se você tiver os arquivos:
a.txt
b.txt
c.txt
A execução do código se expandirá para:
for n in a.txt b.txt c.txt; do
Ou seja: para cada iteração, n
é definido para o próximo nome de arquivo. Você acaba com:
n=a.txt (first loop)
n=b.txt (second loop)
n=c.txt (last loop)
Se coletarmos isso juntos, podemos, por exemplo, escrever algo assim:
#!/bin/bash
printf "Write the file extension you want to search for: "
read ext
printf "Searching for files with extension '%s'\n" "$ext"
for file in *"$ext"; do
printf "File: %s\n" "$file"
done
Ou você pode simplesmente dizer:
ls *"$ext"
Note que o asterisco está fora das aspas. Senão não se expandirá.