Notei recentemente que as especificações POSIX parafind
não incluem o -maxdepth
primário.
Para aqueles que não estão familiarizados com isso, o objetivo do -maxdepth
primário é restringir quantos níveis de profundidade find
descerão. -maxdepth 0
resulta em apenas argumentos de linha de comando sendo processados; -maxdepth 1
trataria apenas os resultados diretamente nos argumentos da linha de comando, etc.
Como posso obter o comportamento equivalente ao -maxdepth
primário não POSIX usando apenas opções e ferramentas especificadas no POSIX?
(Nota: é claro que posso obter o equivalente -maxdepth 0
usando apenas -prune
o primeiro operando, mas isso não se estende a outras profundidades.)
-depth -2
,-depth 1
... poderia ser vista como melhor que a do GNU-maxdepth
/ /-mindepth
-maxdepth
/-mindepth
, existem alternativas razoáveis (observe que-path
é uma adição recente ao POSIX). As alternativas para-timexy
ou-mtime -3m
(ou-mmin -3
) são muito mais complicadas. Alguns gostam-execdir
/-delete
não têm alternativa confiável.Respostas:
Você pode usar
-path
para corresponder a uma determinada profundidade e podar lá. Por exemploseria maxdepth 1, pois
*
corresponde a.
,*/*
correspondências./dir1
e*/*/*
correspondências./dir1/dir2
removidas. Se você usar um diretório inicial absoluto, precisará adicionar um líder/
ao-path
também.fonte
/*
final do padrão, remover o-o
operador e obter o mesmo resultado?*
combina/
também, então o dira/b/c/d/e
caberia-path */*
, infelizmente.a/b/c/d/e
nunca seria alcançado , pois-prune
seria aplicada aa/b
....-prune
e fui-o
removido. Se você mantiver o-prune
problema, isso*/*
não corresponderá a nada em um nível acima da profundidade máxima, por exemplo, o diretório únicoa
.A abordagem de @ meuh é ineficiente, pois
-maxdepth 1
ainda permitefind
ler o conteúdo dos diretórios no nível 1 para depois ignorá-los. Também não funcionará corretamente com algumasfind
implementações (incluindo GNUfind
) se alguns nomes de diretório contiverem seqüências de bytes que não formam caracteres válidos no código do idioma do usuário (como para nomes de arquivos em uma codificação de caracteres diferente).é a maneira mais canônica de implementar o GNU
-maxdepth 1
(ou FreeBSD-depth -2
).Geralmente, porém, é o que
-depth 1
você deseja (-mindepth 1 -maxdepth 1
), como não deseja considerar.
(profundidade 0), e é ainda mais simples:Pois
-maxdepth 2
, isso se torna:E é aí que você executa os problemas de caracteres inválidos.
Por exemplo, se você tiver um diretório chamado,
Stéphane
masé
codificado no charset iso8859-1 (também conhecido como latin1) (0xe9 byte), como era mais comum na Europa Ocidental e na América até meados da década de 2000, esse byte 0xe9 não é um caractere válido em UTF-8. Portanto, nos códigos de idioma UTF-8, o*
curinga (com algumasfind
implementações) não corresponderáStéphane
com*
0 ou mais caracteres e 0xe9 não é um caractere.Meu
find
(quando a saída vai para um terminal) exibe esse byte 0xe9 inválido como?
acima. Você pode ver queSt<0xe9>phane/Chazelas
não eraprune
d.Você pode contornar isso fazendo:
Mas observe que isso afeta todas as configurações de localidade
find
e qualquer aplicativo executado (como por meio dos-exec
predicados).Agora, eu realmente entendo
-maxdepth 2
como o é no segundo Stéphane corretamente codificado em UTF-8 é exibido??
como os bytes 0xc3 0xa9 (considerados como dois caracteres indefinidos individuais no código de idioma C) da codificação UTF-8 de é caracteres imprimíveis no código de idioma C.E se eu tivesse adicionado um
-name '????????'
, eu teria pegado o Stéphane errado (aquele codificado em iso8859-1).Para aplicar a caminhos arbitrários em vez de
.
, faça:para
-mindepth 1 -maxdepth 1
ou:para
-maxdepth 2
.Eu ainda faria um:
Primeiro, porque isso torna os caminhos mais curtos, o que torna menos provável que ocorram em problemas de caminho muito longo ou a lista de argumentos muito longa , mas também para contornar o fato de que
find
não é possível suportar argumentos arbitrários de caminho (exceto-f
com o FreeBSDfind
), pois ele se engasga com valores de$dir
like!
ou-print
...A
-o
combinação com negação é um truque comum para executar dois conjuntos independentes de-condition
/-action
infind
.Se você deseja executar
-action1
em reunião de arquivos-condition1
e independentemente-action2
em reunião de arquivos-condition2
, não é possível:Como
-action2
seria executado apenas para arquivos que atendam às duas condições.Nem:
Como
-action2
não seria executado para arquivos que atendam às duas condições.funciona como se
\( ! -condition1 -o -action1 \)
fosse verdadeiro para todos os arquivos. Isso pressupõe que-action1
é uma ação (como-prune
,-exec ... {} +
) que sempre retorna verdadeira . Para ações como-exec ... \;
essa, pode retornar falso , você pode adicionar outro-o -something
onde-something
é inofensivo, mas retorna verdadeiro como-true
no GNUfind
ou-links +0
ou-name '*'
(embora observe o problema sobre caracteres inválidos acima).fonte
Encontrei um problema em que precisava de uma maneira de limitar a profundidade ao pesquisar vários caminhos (em vez de apenas
.
).Por exemplo:
Isso me levou a uma abordagem alternativa usando -regex. A essência é:
Portanto, o acima seria:
Sem um nome de arquivo:
Por fim, para
-maxdepth 2
o regex muda para:'(dir1|dir2)/([^/]*/){0,1}[^/]*$'
fonte
-maxdepth
funcionaria com vários caminhos de pesquisa.