Usando o GNU find
:
find /some/path -type f -printf '%f\n' | sort | uniq -c
Usando o POSIX find
:
find /some/path -type f | sed 's~^.*/~~' | sort | uniq -c
Isso pressupõe que seus nomes de arquivos não contenham novas linhas.
Gostaria de saber se existe um comando fácil para listar todos os arquivos com os mesmos nomes e números desses arquivos? Eu gostaria de fazer isso de forma recursiva e não quero dizer nome de arquivo concreto. Eu posso imaginar a saída ficaria assim:
FILENAME NUMBER
filename1 2
filename2 4
filename3 8
Usando o GNU find
:
find /some/path -type f -printf '%f\n' | sort | uniq -c
Usando o POSIX find
:
find /some/path -type f | sed 's~^.*/~~' | sort | uniq -c
Isso pressupõe que seus nomes de arquivos não contenham novas linhas.
desde que você não pode ter arquivos com o mesmo nome no mesmo diretório, eu assumi que você os tem em diretórios diferentes (por exemplo, pasta1 / pasta de arquivos2 / pasta de arquivos1 / pasta de outros arquivos2 / outro arquivo)
for name in NAME1 NAME2 NAME3 ; do
echo -n $name \ \ \
ls */$name | wc -l
done
Se eles tiverem apenas o mesmo prefixo (ou seja, picture1 picture2 frame1 frame2), então é quase o mesmo:
for name in NAME1 NAME2 NAME3 ; do
echo -n $name \ \ \
ls $name* | wc -l
done
Para o título apenas preceda a coisa toda com
echo FILENAME \ \ \ \ NUMBER
(é o script BASH, claro)
[Atualize após as solicitações nos comentários:]
#!/bin/bash
# alternative 1
# put filenames sorted and without double entries into array fnames
fnames=( $( find -type f -printf "%f\n" | sort | uniq ) )
# alternative 2: including folder names:
## fnames=( $( find -printf "%f\n" | sort | uniq ) )
# count each names number of appearances:
for (( i=0 ; i<=${#fnames[@]}-1 ; i++ )) ; do
# alternative 1: files only
number=$( find -type f -wholename "*/${fnames[$i]}" -printf "%f\n" | wc -l )
# alternative 2: files and folders with same name
## number=$( find -wholename "*/${fnames[$i]}" -printf "%f\n" | wc -l )
echo -e ${fnames[$i]} \ \ \ $number
done
Tags filenames