Passei dias neste cubo de Rubik. Qualquer coisa que eu faça para corrigir um problema quebra outro.
Estou no MacOS X 10.5 a 10.14 compatível com POSIX. Estou chamando isso de um script Perl em um contexto de
system ("find blah blah > FILENAME");
Eu preciso do Unix 'find' para fazer todas essas coisas de uma vez.
- comece em uma raiz de volume, por exemplo
/Volumes/My HD
- não cruze sistemas de arquivos
- imprimir apenas arquivos, não diretórios ou links simbólicos
- nem desça em vários diretórios como
net dev system
. (Ou seja, não explore /Volumes/foo/dev/ mas explore /Volumes/foo/Users/Jim/ dev /github/twonky/) - o ponto inicial pode conter espaços
No momento, estou fazendo o seguinte: (dividido em várias linhas para facilitar a leitura; na verdade, é uma linha longa)
Find -x '/Volumes/foo/'
-path '/Volumes/foo//dev/*' -prune
-path '/Volumes/foo//net/*' -prune
-path '/Volumes/foo//system/*' -prune
-o -type f -print
A razão para o double / é que a impressão de find inclui o // porque o ponto inicial termina em um /. Os caminhos de Prune devem concordar, ou não combinarão. Por que o ponto de partida termina em /? Porque se isso não acontecer, find falha em qualquer ponto de partida com um espaço no nome, como "Meu HD". Tentei isso.
No momento, find exclui apenas o primeiro diretório da lista. O resto, apenas ignora. Atualmente estou testando no OS X 10.5, mas preciso de algo que funcione em todos os lugares.
Várias ameixas + arquivos apenas + espaços em nomes de arquivos são uma ponte muito longe? Estou apenas pedindo muito de encontrar ?
Você precisa de um "ou" para realizar a segunda correspondência - nenhum caminho único corresponderá a ambos
-path '/Volumes/foo//dev/*'
e-path '/Volumes/foo//net/*'
Minha resposta com uma solução Perl pura.
Com esta caixa de areia:
O seguinte código Perl usando
File::Find
:dá o esperado (se entendi bem):
É um POC, pode ser aprimorado.
Observe também que você tem a
find2perl
ferramenta documentada para poder converter umafind
chamada específica para o código Perl associado usandoFile::Find
os mesmos critérios.Agora com
Path::Class
o código pode parecer mais simples/fácil de ler (para o mesmo resultado):Com a sua ajuda, consegui estabilizar "encontrar". No entanto, mover o código do OS X 10.5 para 10.10 o quebrou novamente . Essa foi a gota d'água. 'find' é simplesmente muito obtuso, subdocumentado e inconsistente, e é um recurso central do unix pelo amor de Deus! Este. É por isso que eu odeio o código de outras pessoas. Comecei a me esforçar para aprender File::Find, então pensei "o que estou fazendo? Posso codificar isso sozinho em 20 minutos".
O que eu fiz sumariamente.
E é rápido. E leve - este código tem metade do tamanho (e mais fácil de manter) do que o código que formatou a lista de argumentos de "find"!