Como listar arquivos começando com "a" ou "c" em / etc. [fechadas]

10

Eu tentei, ls /etc/[ac]*mas mostra os diretórios começando com a ou c e todo o seu conteúdo, não os arquivos iniciados com " a " ou " c ".

3df
fonte
diretórios são um dos muitos tipos de arquivos . Em que tipos de arquivos você está interessado (regular, link simbólico, dispositivo, canal, soquete ...)?
Stéphane Chazelas
Não está claro se você, por "diretório", está falando sobre o conteúdo dos diretórios ou sobre os nomes dos próprios diretórios. O comando que você mostra listaria o conteúdo dos diretórios que correspondem ao padrão, ls -d /etc/[ac]*pois você não obteria o conteúdo dos diretórios correspondentes, mas ainda veria os nomes dos diretórios. Não está claro se é isso que você deseja ou se deseja evitar listar os nomes dos diretórios.
Kusalananda

Respostas:

23

Para evitar listar o conteúdo dos diretórios, você pode:

ls -d /etc/[ac]*

Isso listará os nomes de diretório juntamente com os nomes de arquivo comuns iniciados com aou c.

Para findgarantir a integridade, uma solução que não envolve pode ser:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
Greg Hewgill
fonte
Minha leitura inicial da pergunta também ls -dpareceu apropriada, mas parece que a pergunta original especifica que nenhum diretório deve ser listado, independentemente de expansão ou não expansão.
Chris Down
1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9não analise ls.
Avinash Raj
1
@AvinashRaj: Bem, a relevância desse conselho depende se é necessário que essa solução funcione uma vez ou para sempre. Se apenas uma vez, então analisar lsé um jogo justo na minha opinião.
Greg Hewgill
3
Ele tem um ponto. Embora os nomes em /etcprovavelmente sejam sãos, um espaço simples interromperá a lsabordagem, pois os números dos campos serão alterados. +1 para ls -ldembora.
terdon
1
Você também precisa corrigir o código do idioma ( LC_ALL=C), a data não é garantida para ter três campos em outros códigos do idioma .
Stéphane Chazelas
7

Recursivamente:

find /etc -type f -name '[ac]*'

Se você precisar de não recursão, poderá fazer isso de maneira portável:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Ou isso, de maneira não portável (GNU ou uma descoberta recente do BSD):

find /etc -type f -maxdepth 1 -name '[ac]*'

Se você quer fazer neste caso insensível, use -inameem vez de -name.

Chris Down
fonte
1
Observe que -type fé para arquivos regulares . Se você precisar de arquivos que não sejam de diretórios, substitua por ! -type d(ou ! -xtype dpelo GNU findse também quiser excluir links simbólicos para diretórios).
Stéphane Chazelas
1

Você pode tentar este comando também,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'
Avinash Raj
fonte
1

Se você deseja diretórios (não o conteúdo do diretório) e arquivos, pode usar o printfcomando bultin:

printf "%s\n" [ac]*

Exemplo:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt
cuonglm
fonte
Como isso evitará diretórios, conforme solicitado na pergunta?
Chris Down
Oh, minha leitura errada. Acho OP quer diretório, mas não o seu conteúdo.
cuonglm
Desculpe pela edição, completamente mal interpretada.
terdon
1

Não recursivo sem find:

ls -pd /etc/[ac]* | grep -v '/$'

o -padiciona um /no final dos diretórios, os quais são grepfiltrados. É claro que não funciona para nomes de arquivos que contêm caracteres especiais, como novas linhas.

Anthon
fonte
1

Com zsh:

print -rl /etc/[ac]*(.)

Listaria os arquivos regulares (como -type fem find) listados em /etccujo nome começa com aou c. A (xxx)parte no final de um globo é um recurso específico do zsh chamado qualificador de globbing. .como qualificador de globbing significa arquivo regular .

Se o glob não corresponder, zshabortará o comando. Observe que em outros shells semelhantes a Bourne, se o glob não corresponder, o padrão se expandirá para si mesmo; portanto, ls -d /etc/[ac]*poderá listar incorretamente um arquivo chamado /etc/[ac]*se não houver um arquivo começando com aou cdentro /etc.

print -rl /etc/[ac]*(^/)

listaria os arquivos que não são do tipo diretório e

print -rl /etc/[ac]*(-^/)

listaria os arquivos que não são do tipo diretório depois de resolver os links simbólicos.

Stéphane Chazelas
fonte
-3

Para arquivos de exibição iniciados com:

ls etc |  grep ^a

Para exibir arquivos começando com c:

ls etc |  grep ^c
Raj
fonte