Imprimindo o número de arquivos com o mesmo nome para cada arquivo de um diretório

1

Eu sou novo no Linux e tenho uma atribuição que requer escrever um script de shell que imprime todos os nomes de arquivos e subdiretórios de um diretório (dado como parâmetro) e isso também deve imprimir o número de arquivos com o mesmo nome para cada arquivo deste diretório.

Meu problema é que consegui imprimir os nomes de todos os arquivos e diretórios e também fazer a segunda parte da tarefa, mas não consigo juntá-los, o que significa que minha saída tem duas partes diferentes:

/some/path
a1  
a2 
a3

a1 1
a2 1
#a1, a2 files and a3 directory

E deve ficar assim:

a1 1
a2 1
a3 

Este é o código que eu usei escrevendo meu shell script:

#the first part that prints all the names from the directory
mydir=$1
cd $mydir
ls -l $mydir | awk '{print $9}'

#the second part that prints the number of files with the same name for every file
file=$(find $mydir -type f -printf '%f\n' | sort | uniq -c)
echo $file
    
por Stefana Baltatescu 14.05.2017 / 23:07

1 resposta

2

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:

  1. não é necessário cd para o diretório para ls it
  2. não é necessário awk o nome do arquivo; você poderia apenas ls , mas ...
  3. executar o ls ... awk separadamente do find significa que você separou a saída
  4. não é necessário imprimir especialmente a saída find se tudo o que você está fazendo é contá-la
  5. não há necessidade de classificar a saída se tudo que você está fazendo é contá-la
  6. não é necessário usar uniq se você estiver tentando capturar todos
  7. Tomei a liberdade de remover -type f no caso de sua atribuição querer que você encontre diretórios com o mesmo nome
  8. adicionou -name "$f" para ter find somente arquivos com nomes correspondentes
  9. use printf para combinar o nome do arquivo e conta na mesma linha de saída
  10. não é necessário analisar a saída de ls para obter o (s) nome (s) de arquivo (s); é isso que for 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.

    
por 15.05.2017 / 02:59