Como eu listaria todos os diretórios que não possuem um arquivo com um nome de arquivo específico? por exemplo, dada esta árvore
/
/a
README
file001
file002
/b
README
file001
/c
file003
Quero listar os diretórios que não têm um arquivo nomeado README
; nesse caso, seria diretório /c
. Como eu faria isso? Não consigo pensar em nenhuma sintaxe usando, por exemplo find
.
Respostas:
Supondo que uma
find
implementação como o GNUfind
que aceite um{}
incorporado em um argumento para-exec
:Exemplo
Aqui os diretórios 1/1 a 5/5 têm um README, os outros diretórios estão vazios.
Agora, quando executamos esta versão do nosso
find
comando:Referências
fonte
Você pode usar a
-exec
opção defind
para verificar o arquivo e imprimir todos os resultados para os quais a verificação falha.fonte
Não há necessidade
find
. Basta usar o shell:Se você precisar que seja recursivo, poderá usar (para
bash
,zsh
pode fazer isso por padrão, useset -o globstar
emksh93
):(observe que os arquivos de ponto são excluídos por padrão).
fonte
Com
zsh
e qualificadores glob (e
string ):ou
adicione
D
para incluir diretórios ocultos:/
seleciona apenas diretórios e,e_'[[ ! -f $REPLY/README ]]'_
além disso, seleciona apenas os nomes de diretório para os quais o código do shell entre as aspas retornatrue
, ou seja, para cada nome de diretório ($REPLY
) ao qual o glob se*(/)
expande, ele executa[[ ! -f $REPLY/README ]]
e mantém o nome do diretório, se o resultado fortrue
.O segundo formulário
^e_'.....'_
usa o mesmo qualificador global, negado (mas desta vez a expressão condicional não é negada:)[[ -f $REPLY/README ]]
.O exemplo acima retornará apenas nomes de diretório no diretório atual.
Se você deseja pesquisar recursivamente (novamente, para incluir diretórios ocultos, adicione o
D
qualificador):fonte
Portably, você poderia fazer:
[ -f file ]
testa se o arquivo existe e está confirmado como um arquivo regular (após a resolução do link simbólico).Se você quiser testar se ele existe apenas (como uma entrada nesse diretório), independentemente do seu tipo, você precisará:,
[ -e file ] || [ -L file ]
embora observe que precisa de permissão de pesquisa no diretório para executar esses testes. Você pode adicionar alguns[ -x "$dir" ]
testes para dar conta de casos como:Ou para evitar a condição de corrida, com
zsh
:Consulte também Como saber se um arquivo regular não existe no Bash? em SO.
fonte