Existem muitos comandos de nível mais alto que quase farão o que você quer fazer, mas esta é uma boa demonstração de como fazer a mesma coisa em um script de shell. Isso deve funcionar em qualquer sistema que tenha /bin/sh
. Não depende de nenhum outro comando.
Você pode salvar este script como qualquer nome de arquivo e, em seguida, digitar sh ./whatever_you_named_it
para executá-lo.
Eu dividi isso em duas seções, Listando os arquivos e Contando os arquivos . Listar os arquivos recursivamente é o mais complicado, mas assim que tivermos uma lista, é fácil contá-los.
Listando os arquivos
Esse script lista recursivamente todos os arquivos e diretórios em seu diretório pessoal ou em um diretório que recebe como parâmetro. Sem parâmetros, o padrão é o diretório inicial.
#!/bin/sh
if test $# -eq 0
then
startdir="$HOME"
else
startdir="$1"
fi
for f in "$start"/* # step through all files in the starting directory
do
echo "$f" # print the file name
if test -d "$f" # is the file a directory? (-d)
then
sh "$0" "$f" # yes call this script with the dir as arg
fi
done
Vamos discutir cada passo:
-
Se nenhum parâmetro foi passado para o script, use "$ HOME" como o diretório inicial, caso contrário, use o primeiro parâmetro. ($ # contém o número de parâmetros passados para este script e usamos o comando
test
embutido do shell para descobrir se é zero):if test $# -eq 0 then startdir="$HOME" else startdir="$1" fi
-
Itere os arquivos no seu diretório pessoal.
"$HOME"/*
expande para todos os arquivos e diretórios não ocultos no nível superior de seu diretório pessoal:for f in "$HOME"/* do
-
Imprima o nome do arquivo. Eu acho que você sabe
echo
:echo "$f" # print the file name
-
Chame o comando
test
do shell integrado com a opção-d
.test
retornará verdadeiro se o argumento"$f"
for um diretório. Isso geralmente é escrito como[ -d "$f" ]
por brevidade, mas é realmente um comando. [Procure por "expr de teste" na páginash
man]:if test -d "$f" # is the file a directory? (-d) then
-
Esta próxima declaração é onde nós recorremos. Começamos uma nova cópia do script atualmente em execução e passamos o nome do diretório atual "$ f" para ele. O
$0
expande para o nome do arquivo do script de shell atual. Em vez de digitar algum nome de arquivo aqui, usamos$0
para que esse script funcione mesmo que seu nome seja alterado. Por exemplo, se o script fosse chamado derlist
, você também poderia escreversh rlist "$f"
, mas se o script fosse renomeado, o script não funcionaria mais corretamente, porque ele estaria chamando um script inexistente ou o erro roteiro. [Consulte "Parâmetros especiais" na páginash
man]:sh "$0" "$f" # yes call this script with the dir as arg
-
Encerra a instrução
if
e o loopfor
.fi done
Contando os arquivos
O script até agora lista os arquivos, mas não os conta. Se você quiser obter uma contagem de todos os arquivos e diretórios, execute:
sh ./scriptname | wc -l
wc -l
é o comando "contagem de palavras" e, com a opção -l
, conta apenas as linhas. O pipeline acima imprime um número que é o número de arquivos em seu diretório pessoal.