POSIXly:
find . ! -name . -prune -type f -name 'F*'
com zsh
:
print -rl -- F*(.)
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?
POSIXly:
find . ! -name . -prune -type f -name 'F*'
com zsh
:
print -rl -- F*(.)
Eu poderia usar o comando find:
find ./ -name "F*" -type f
-type f significa que você quer apenas arquivos regulares.
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.