qual é o extra "no segundo comando sed fazendo lá?
/tmp/test $ touch foo.bar foo.baz foo.foo
/tmp/test $ find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'| sort | uniq -c | grep " 3 "
3 /tmp/test/foo
Estou tentando encontrar todos os arquivos com o mesmo nome de arquivo (excluindo a extensão do arquivo) que ocorrem 3 vezes. Eu também preciso do caminho completo para o arquivo.
O que eu tenho atualmente é
#get file without extension
alias lse="ls -1R | sed -e 's/\.[a-zA-Z]*$//'"
#print out the current dir and get files occuring 3 times
lse | sed "s;^;'pwd'/;" | sort | uniq -c | grep " 3 "
Isso executa howver pwd
imprime a pasta em que executei o comando, não o caminho para o arquivo.
Então eu tentei find
find . -type f | sed "s#^.#$(pwd)#" | sort | uniq -c
Isso é executado, mas inclui a extensão do arquivo. Quando tento adicionar sed -e 's/\.[a-zA-Z]*$//'"
, recebo erros, pois não tenho certeza de como combinar os dois comandos sed e não consigo transmitir uma segunda vez ao sed?
Então, o que estou tentando fazer é
find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'"| sort | uniq -c | grep " 3 "
mas isso não funciona.
Alterna, mas de forma semelhante, usando alguns outros conceitos:
find . -type f -printf '%f\n' | sed 's/\.[[:alpha:]]*$//' |\
sort | uniq -c | awk '$1==3'
Usos:
find
-printf
para remover diretamente os diretórios principais. [:alpha:]
para definir letras. Isso simula seu exemplo, mas não leva em conta as terminações de arquivo com números (por exemplo, .mp3
). Altere para [:alnum:]
para corresponder letras e números. Procure mais informações sobre as classes de personagens para ver outras possibilidades. awk
para imprimir apenas as linhas com a contagem 3 (facilmente alterado para count>=3
, o que parece mais lógico). Como print
é a ação padrão, isso pode ser realizado usando apenas awk '$1==3'
.