No bash, estou tentando encontrar diretórios que contenham um arquivo específico; no entanto, esses diretórios estão em níveis diferentes, por exemplo, se eu estiver procurando por dir03/myfile.txt:
dir01/dir02/dir03/myfile.txt
dir01/dir03/ ##no target file in it
dir01/dir04/dir05/dir03/myfile.txt
dir01/dir04/dir05/dir06/myfile.txt ##I do not want this
Eu poderia fazer:
find ./dir01 -type -d -iname "dir03"
Mas então eu obteria todos os diretórios, mesmo aqueles sem o arquivo de destino
Se eu fizer isso:
find ./dir01/*/dir03 -iname "myfile.txt"
Eu não veria "dir01/dir04/dir05/dir03/myfile.txt"
Isso não funciona:
find ./dir01 -iname "dir03/myfile.txt"
##find: warning: Unix filenames usually don't contain slashes (though pathnames do).
That means that '-iname ‘dir03/myfile.txt’' will probably evaluate to false all the time on this system. You might find the '-wholename' test more useful, or perhaps '-samefile'. Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ ‘dir03/myfile.txt’'
Eu posso fazer isso:
find ./dir01 -iname "myfile.txt" -print0 | grep -FzZ 'dir03' | sed "s/myfile\.txt/\n/g"
Ele encontra todas as correspondências onde myfile.txt está e obtém apenas as contidas no diretório de destino; depois disso, divido os resultados com uma nova linha (a linha acima fornece os resultados concatenados, por exemplo, ./dir01/dir02/dir03/myfile.txt./dir01/dir04/dir05/dir03/myfile.txt
mas pode tornar a pesquisa mais genérica e longa caso eu tenha uma estrutura de subdiretório complexa. Eu queria saber se havia uma solução mais fácil para dizer ao find para encontrar "dir03/myfile.txt" em qualquer nível
Observe que os nomes dos diretórios são apenas para fins de exemplo, eles não compartilham o mesmo prefixo.
Editar : Acho que eu poderia fazer
find ./dir01 -iname "myfile.txt" > myres0.txt
grep 'dir03' myres0.txt > myres1.txt
Considerando que estou procurando por vários diretórios parentais e não apenas dir03, ele faria apenas uma pesquisa, então eu poderia usar um arquivo txt com meus diretórios de destino e fazer:
grep -f mytargetDirs.txt myres0.txt > myres1.txt
Ainda estou me perguntando se existe uma maneira melhor.