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
cd
para o diretório parals
it - não é necessário
awk
o nome do arquivo; você poderia apenasls
, mas ... - executar o
ls ... awk
separadamente dofind
significa que você separou a saída - não é necessário imprimir especialmente a saída
find
se 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
uniq
se você estiver tentando capturar todos - Tomei a liberdade de remover
-type f
no caso de sua atribuição querer que você encontre diretórios com o mesmo nome - adicionou
-name "$f"
para terfind
somente arquivos com nomes correspondentes - use
printf
para combinar o nome do arquivo e conta na mesma linha de saída - não é necessário analisar a saída de
ls
para 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.