É possível listar todos os arquivos que começam com uma letra, mas não com diretórios?

1

Eu preciso do meu trabalho em casa para obter uma lista de todos os arquivos que começam com a letra F , eu sei do comando:

ls F*

Mas também me dá diretórios, é possível mostrar apenas arquivos reais?

    
por user142424 28.11.2015 / 18:58

3 respostas

3

POSIXly:

find . ! -name . -prune -type f -name 'F*'

com zsh :

print -rl -- F*(.)
    
por 28.11.2015 / 19:07
1

Eu poderia usar o comando find:

find ./ -name "F*" -type f

-type f significa que você quer apenas arquivos regulares.

    
por 28.11.2015 / 19:05
1

Claro - usando find (que não classifica nomes como ls faz, então eu adicionei isso):

find . -type f -maxdepth 1 -name 'F*' |sort |xargs ls -l {} \;

ou (se você quiser apenas os nomes)

find . -type f -maxdepth 1 -name 'F*' |sort

A opção -maxdepth não está em POSIX , mas desde que você marcou isso com bash , podemos fazer algumas suposições. Por exemplo, ele funciona com OSX (o outro plataforma onde as pessoas geralmente usam bash ).

Em qualquer caso, deixado para si mesmo, find mostrará arquivos em subdiretórios, o que é algo que ls não fará sem adicionar um -R .

Um problema com find é que sua saída pode incluir nomes de arquivos com caracteres não imprimíveis (espaços em branco, etc). Linux e OSX find fornecem uma extensão (não em POSIX) chamada -print0 , que funciona com xargs extensão complementar -0 . Então você poderia fazer isso:

find . -type f -maxdepth 1 -print0 -name 'F*'  |sort -z |xargs -0 ls -l {} \;

ou (se você quiser desistir do recurso de classificação), você pode usar o POSIX direto:

find . -type f -maxdepth 1 -name 'F*' -exec ls -l {} +

A classificação é principalmente um problema quando você quer uma listagem detalhada, mas o POSIX + não seria útil se você quiser uma lista ordenada, desde novas linhas (ainda legais) na lista de nomes interferiria na classificação.

@cuonglm aponta que o POSIX tem a opção -prune , que diz:

-prune
The primary shall always evaluate as true; it shall cause find not to descend the current pathname if it is a directory.

e se você estiver usando "." para o argumento de find (como feito aqui), então não há necessidade da opção -maxdepth . É verdade, mas se seguirmos a analogia para ls mais, então "." é o equivalente a ls -a , enquanto que a correspondência estrita da pergunta de OP deixaria cair a opção "-a" e o argumento para find poderia ser "*". No entanto (como lembrado por @cuonglm ), -prune é útil apenas para diretórios e find * -prune corresponderia ao conteúdo do diretório.

Também é possível usar uma expansão de curinga de shell, por exemplo,

for n in F*;do [ -f "$n" ] && echo "$n"; done

que é (provavelmente) preferível a ls F* , uma vez que não converte caracteres não imprimíveis em pontos de interrogação, a expansão de caractere curinga em ambos os casos é executada em restrições de comprimento de comando.

Por fim, a resposta depende de se o OP deseja uma listagem ou uma lista de nomes. Mas em ambos os casos, ls por si só não pode fazer o trabalho.

    
por 28.11.2015 / 19:03

Tags