Você não pode usar find
para procurar por arquivos que não existem. No entanto, você pode usar find
para procurar diretórios e, em seguida, testar se os nomes de arquivos fornecidos existem nesses diretórios.
Ao usar find
para procurar diretórios, certifique-se de usar -type d
. Em seguida, teste cada um dos diretórios encontrados para os arquivos README
e readme
.
Assumindo a hierarquia de diretório a seguir para algum diretório superior projects
:
projects/
|-- toola
| |-- doc
| |-- readme
| '-- src
|-- toolb
| |-- doc
| '-- src
|-- toolc
| |-- README
| |-- doc
| '-- src
'-- toold
|-- doc
'-- src
Usando find
para encontrar os diretórios diretamente em projects
que não contém um arquivo README
ou readme
:
$ find projects -mindepth 1 -maxdepth 1 -type d \
! -exec test -f {}/README ';' \
! -exec test -f {}/readme ';' -print
projects/toolb
projects/toold
Aqui, encontramos qualquer diretório diretamente sob projects
e, em seguida, usamos o utilitário test
para determinar qual dos diretórios encontrados não contém nenhum dos dois arquivos.
Isso é exatamente o equivalente de
find projects -mindepth 1 -maxdepth 1 -type d \
-exec [ ! -f {}/README ] ';' \
-exec [ ! -f {}/readme ] ';' -print
Outra formulação dos itens acima:
find projects -mindepth 1 -maxdepth 1 -type d -exec sh -c '
for pathname do
if [ ! -f "$pathname/README" ] &&
[ ! -f "$pathname/readme" ]; then
printf "%s\n" "$pathname"
fi
done' sh {} +
Aqui, deixamos um pequeno script de shell em linha fazer o teste real dos dois arquivos e imprimir o nome do caminho dos diretórios que não contêm nenhum deles. O utilitário find
age como um "gerador de nome de caminho" de nomes de caminho para diretórios para o script in-line para iterar.
Na verdade, se a estrutura do diretório for assim, podemos optar por não usar find
:
for pathname in projects/*/; do
if [ ! -f "$pathname/README" ] &&
[ ! -f "$pathname/readme" ]; then
printf '%s\n' "$pathname"
fi
done
Observe a barra no final no padrão projects/*/
. É isso que faz com que o padrão corresponda apenas aos diretórios (ou links simbólicos para diretórios).
A diferença entre fazer isso e usar find
é que, com o loop de shell acima, excluiremos diretórios ocultos em project
e incluiremos links simbólicos para diretórios.
Em todos os casos, iteramos sobre os nomes de caminho dos diretórios e testamos a inexistência dos dois nomes de arquivos.
A única ressalva é que o teste -f
também será verdadeiro para um link simbólico para um arquivo normal.
Relacionados: