Obtendo o shellscript para exibir uma extensão de arquivo escolhida

0

Eu sou novo nisso com shellscript e Linux e agora estou preso. Vou escrever um programa simples que me permita pesquisar a extensão de arquivo que eu quero e exibir quantos deles existem. Eu tenho procurado na net e lido o livro que eu tenho, mas eu simplesmente não consigo descobrir.

Isso é o que eu consegui até agora:

#!/bin/bash

#Program to search for how many of specific file extension there is in this directory.

echo "Write the file extension you want to search for:"
read n

for n in 'ls *.txt' ; do
  echo $n
done

Suponho que use um loop for.

Como eu continuo daqui?

    
por Anileve 13.01.2015 / 07:24

5 respostas

1

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á.

    
por 13.01.2015 / 07:57
0

Você provavelmente deve usar find . Algo como:

echo "Write the file extension you want to search for:"
read n
find . -name "*.$n"

De qualquer forma, o que você provavelmente pretendia fazer era:

for i in *."$n"
do
    echo "$i"
done

Caso contrário, você não está usando o valor de n (em vez disso, usando a extensão fixa txt ) e sobrescrevendo o valor de leitura de n no loop for ,

    
por 13.01.2015 / 07:34
0

Você pode fazer isso:

#!/bin/bash
echo -n "Write the file extension you want to search for:"
read n
find $1 -iname "*.$n" -print 

uso:

./myscript.sh mypath

A saída é:

root@debian:/home/mohsen/test# ./myscript.sh /home/mohsen
Write the file extension you want to search for:sh
/home/mohsen/Downloads/binary files/apt-fast_aria2c.sh
/home/mohsen/Downloads/binary files/apt-fast.sh
/home/mohsen/Downloads/binary files/toggle_touchpad.sh
/home/mohsen/Downloads/binary files/nvidia-versions.sh
/home/mohsen/Downloads/R/x/PacketTracer601/set_ptenv.sh
/home/mohsen/codes/IraninCalendar/test/jcal-master/sources/ltmain.sh
/home/mohsen/codes/IraninCalendar/test/jcal-master/sources/autogen.sh
^C
    
por 13.01.2015 / 07:33
0

Um comando de linha única:

echo "Enter file extension:"  
for f in 'find <some_path> -name "*$(read n; echo $n)"' ; do echo $f ; done
    
por 13.01.2015 / 14:05
0

search for andy file extension I want and then display how many of them there are

Você não precisa de um loop para isso. Assumindo que não há caracteres de nova linha dentro dos nomes dos arquivos, você pode escrever

wc -l < <(ls *."$n")
    
por 13.01.2015 / 14:58