Quero exibir todos os diretórios que não contêm arquivos com um final de arquivo específico. Portanto, tentei usar o seguinte código:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
Neste exemplo, eu queria exibir todos os diretórios que não contêm arquivos com o final .ENDING
, mas isso não funciona.
Onde está meu erro?
Respostas:
Aqui está uma solução em três etapas:
fonte
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
Aqui vamos nós!
Ou alternadamente (e mais pitonico):
Conteúdo bônus DLC!
A versão (principalmente) corrigida do comando find:
fonte
test: ...: binary operator expected
se houver vários*.ENDING
arquivos em um diretório.next(filter(lambda x: x.endswith('.ENDING'), filenames))
também poderia ser escrito usando a compreensão do gerador, ou sejanext(x for x in filenames if x.endswith('.ENDING'))
.if not any(x.endswith('.ENDING') for x in filenames)
base no fato de que qualquer retornoFalse
para um iterável vazio.O shell expande o
*
, mas no seu caso não há nenhum shell envolvido, apenas o comando test executado pelo find . Portanto, o arquivo cuja existência é testada é literalmente nomeado*.ENDING
.Em vez disso, você deve usar algo como isto:
Isso resultaria em sh expansão
*.ENDING
quando teste é executado.Fonte: encontre globbing no UX.SE
fonte
-c: line 0: syntax error near unexpected token
(''. Os nomes dos meus diretórios têm o formato 'xyz (dfdf)'. Na verdade, é uma biblioteca de calibre.sh: line 0: test: foo1/bar.ENDING: binary operator expected
o diretório que contém um arquivo com o finalENDING
.sh: -c: line 0: syntax error near unexpected token
('sh: -c: linha 0:' test -e test (test) / *. Terminando '). / test (teste) `Mas quando eu mudar .ending para .xyz eu obter o mesmo resultado Isto é porque eu tenho brácteas como nome do diretório, certo Como posso corrigir isso..?Inspirado nas respostas de Dennis Nolte e MikeyB , vim com esta solução:
Funciona com base no fato de que
A propósito, é por isso que o stderr foi redirecionado
/dev/null
.fonte
Eu faria isso em perl pessoalmente
Deve fazer o truque (funciona no meu caso de teste muito simplista).
fonte
Heres um achado one-liner.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u
Edit : Opa, também não funcionará.
fonte
q
no egrep é para silêncioCom
egrep
você pode trocar o regex que você precisals -1 "{}"
gera os nomes de arquivo do comando findfonte