encontrar diretórios contendo vários arquivos compartilhando o mesmo nome base

0

Como eu iria modificar a seguinte instrução bash para obter apenas os diretórios que correspondem exatamente genre_(basename) e outro genre_*. Como próximo passo, acrescentei | wc -lao segundo find, mas para cada linha recebo o mesmo número muito alto, o que me diz que é uma contagem entre diretórios (por quê?)?

$ find . -name 'genre_' -exec dirname {} \; | while EFS= read -r thedir; do echo "$(find . -name 'genre_*')"; done
./The-Specials/genre_
./The-Specials/genre_rock
./ACDC/genre_Hard-Rock
./We-3/genre_
./We-3/genre_Jazz

Na saída acima, somente o ACDC deve ser filtrado.

Erwann
fonte
3
Por favor edite. Realmente um pouco confuso. Qual é o exemplo de uma árvore de diretórios de origem na qual você executaria isso e qual seria a saída desejada.
JakeGould

Respostas:

0

Eu admito que não entendo o que seu código deve fazer (leia: a questão não está clara nesse assunto). No entanto, posso responder isso:

Como próximo passo, acrescentei | wc -lao segundo find, mas para cada linha recebo o mesmo número muito alto, o que me diz que é uma contagem entre diretórios (por quê?)

Você, read -r thedirmas thedirnunca é usado. O segundo findé o mesmo comando toda vez, começando no .mesmo número.

Bônus: Eu não vejo o ponto de echo "$(find …)". Este código cheira peixe. Provavelmente deveria ser justo find ….

Kamil Maciorowski
fonte
Desculpe, deveria ter sido $thedirno lugar da .segunda finddeclaração. Isso resolveu: $ find . -name 'genre_' -exec dirname {} \; | while EFS= read -r thedir; do var="$(find $thedir -regex '.*genre_.*'| wc -l)"; if (( "$var" > 1 )); then rm "$thedir"/genre_; fi; done mas agradeço qualquer sugestão para torná-lo mais conciso.
Erwann