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:
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.
@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.
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'
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.
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.
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.Respostas:
Para evitar listar o conteúdo dos diretórios, você pode:
Isso listará os nomes de diretório juntamente com os nomes de arquivo comuns iniciados com
a
ouc
.Para
find
garantir a integridade, uma solução que não envolve pode ser:fonte
ls -d
pareceu apropriada, mas parece que a pergunta original especifica que nenhum diretório deve ser listado, independentemente de expansão ou não expansão.ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
não analisels
.ls
é um jogo justo na minha opinião./etc
provavelmente sejam sãos, um espaço simples interromperá als
abordagem, pois os números dos campos serão alterados. +1 parals -ld
embora.LC_ALL=C
), a data não é garantida para ter três campos em outros códigos do idioma .Recursivamente:
Se você precisar de não recursão, poderá fazer isso de maneira portável:
Ou isso, de maneira não portável (GNU ou uma descoberta recente do BSD):
Se você quer fazer neste caso insensível, use
-iname
em vez de-name
.fonte
-type f
é para arquivos regulares . Se você precisar de arquivos que não sejam de diretórios, substitua por! -type d
(ou! -xtype d
pelo GNUfind
se também quiser excluir links simbólicos para diretórios).Você pode tentar este comando também,
fonte
Se você deseja diretórios (não o conteúdo do diretório) e arquivos, pode usar o
printf
comando bultin:Exemplo:
fonte
Não recursivo sem
find
:o
-p
adiciona um/
no final dos diretórios, os quais sãogrep
filtrados. É claro que não funciona para nomes de arquivos que contêm caracteres especiais, como novas linhas.fonte
Com
zsh
:Listaria os arquivos regulares (como
-type f
emfind
) listados em/etc
cujo nome começa coma
ouc
. 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,
zsh
abortará 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 coma
ouc
dentro/etc
.listaria os arquivos que não são do tipo diretório e
listaria os arquivos que não são do tipo diretório depois de resolver os links simbólicos.
fonte
Para arquivos de exibição iniciados com:
Para exibir arquivos começando com c:
fonte