No contexto de uma tarefa "aprendendo Linux / shell script", eu sugeriria algo ao longo destas linhas:
mydir=$1
for f in "$mydir"/*
do
printf "%s %d\n" "$f" $(find "$mydir" -name "$f" -print 2>/dev/null | wc -l)
done
Ajustes do seu script:
- não é necessário
cdpara o diretório paralsit - não é necessário
awko nome do arquivo; você poderia apenasls, mas ... - executar o
ls ... awkseparadamente dofindsignifica que você separou a saída - não é necessário imprimir especialmente a saída
findse tudo o que você está fazendo é contá-la - não há necessidade de classificar a saída se tudo que você está fazendo é contá-la
- não é necessário usar
uniqse você estiver tentando capturar todos - Tomei a liberdade de remover
-type fno caso de sua atribuição querer que você encontre diretórios com o mesmo nome - adicionou
-name "$f"para terfindsomente arquivos com nomes correspondentes - use
printfpara combinar o nome do arquivo e conta na mesma linha de saída - não é necessário analisar a saída de
lspara obter o (s) nome (s) de arquivo (s); é isso quefor f in "$mydir"/*- em particular, o*- faz; ele se expande para corresponder aos nomes dos arquivos.
Eu também citei todos os seus usos variáveis, caso o usuário forneça um nome de arquivo como "this file" .
Isso não mostrará arquivos ocultos na saída; você pode adicionar shopt -s dotglob para ter o "$mydir"/* expand para corresponder aos arquivos de ponto (arquivos ocultos) também.
Como uma advertência avançada, isso irá confundir nomes de arquivos que possuem novas linhas, desde que o usuário passe um nome de arquivo contendo uma nova linha para procurar.