Tenho quase certeza de que isso não é algo que o zsh
shell fornece uma maneira de fazer, mas pensei em perguntar de qualquer maneira apenas para ter certeza de que não estou perdendo nada do manual.
Com o zsh
shell, posso escolher os dois maiores arquivos visíveis de um diretório com o padrão
*(.OL[1,2])
Se eu tiver um conjunto de diretórios e quiser ter os dois maiores arquivos de cada um, acredito que teria que percorrer os diretórios individuais e depois usar
$dirpath/*(.OL[1,2])
(onde $dirpath
é o caminho do diretório na iteração atual do loop).
Seria bom poder dizer
*/*(.OL[1,2])
mas esse qualificador glob se aplicaria à lista de nomes correspondentes como um todo, e eu obteria duas correspondências, não duas de cada diretório.
Descrição: Seria possível limitar o "escopo" do qualificador para afetar apenas o componente de caminho mais recente de alguma forma?
Você não precisa de um laço. Uma variável intermediária é suficiente. Use o
^
sigilo de expansão de parâmetro para distribuir pelo array.Ou você pode usar uma função anônima para evitar a variável temporária (que se torna
$argv
/$@
os argumentos da função anônima):Outra abordagem poderia ser algo como:
Pode-se definir a
$reply
matriz noe
qualificador glob xpression para retornar uma lista de arquivos. Então aqui, nós globizamos a lista de dirs ou links simbólicos para dirs e para cada um, retornamos os 2 maiores arquivos regulares.Observe que a
e
sintaxe do qualificador ée:code:
, onde é possível usar outros caracteres além:
do delimitador ou pares comoe(code)
,e[code]
. Mas observe que as expansões de palavras são executadas nacode
parte, na verdade em qualquer lugar nos qualificadores glob, o que é bom porque você pode usar variáveis lá como*(L+$min_size)
, mas aqui significa que você geralmente precisa colocar ascode
aspas simples dentro para evitar as expansões.Agora, (e é um truque que aprendi há relativamente pouco tempo ) se em vez de
:
, você usa um caractere que por acaso é um caractere curinga (que inclui?
,*
mas também o[
par]
) como delimitador e deixa os delimitadores fora das aspas, então você não não precisa se preocupar se esse caractere pode aparecer no código, porque um*
delimitador sem aspas só pode ser correspondido por outro sem aspas*
, e o mesmo para[
vs]
.Portanto
*(N-/e['reply=($REPLY/*(N.OL[1,2]))'])
, funciona mesmo que]
ocorra dentro do código (quoted) delimitado por unquoted[...]
. Não funcionaria com outros delimitadores como:...:
ou(...)
ou{...}
.