Eu posso usar ls -ld */
para listar todas as entradas do diretório no diretório atual. Existe uma maneira igualmente fácil de listar todos os arquivos regulares no diretório atual? Eu sei que posso usar o find
find . -maxdepth 1 -type f
ou stat
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
mas isso não me parece excessivamente elegante. Existe uma maneira curta e agradável de listar apenas os arquivos regulares (não me importo com dispositivos, tubulações etc.), mas não os subdiretórios do diretório atual? Listar links simbólicos também seria uma vantagem, mas não é uma necessidade.
find
comando é a melhor maneira de fazer o que você deseja. Para outras opções confiáveis, você deve procurar comandos específicos do shell (e esses são tudo menos portáteis)!ls -d */
, curto, fácil de digitar e fácil de entender. Então, eu estou muito feliz com a resposta de Ulrich Dangel, mesmo que não esteja usando o zsh.Respostas:
Com os Qualificadores
zsh
e Glob, você pode expressá-lo facilmente diretamente, por exemplo:retornará apenas a lista de arquivos regulares ou um erro, dependendo da sua configuração.
Para os não diretórios:
(incluirá links simbólicos (inclusive para diretórios), tubos nomeados, dispositivos, soquetes, portas ...)
para arquivos regulares e links simbólicos para arquivos regulares.
para não diretórios e também não possui links simbólicos para diretórios.
Além disso, consulte o
D
qualificador de globbing se desejar incluir arquivos D ot (arquivos ocultos), como*(D-.)
.fonte
Este comando lista todos os arquivos não ocultos que não são diretórios (arquivos regulares, links, arquivos de dispositivos etc.). Para também incluir arquivos ocultos, adicione a
-A
opção als
Ele assume que nenhum dos arquivos possui caracteres de nova linha em seu nome. Adicionar uma
-q
opção parals
transformar todos os caracteres não imprimíveis, incluindo nova linha em?
, garantindo que eles estejam em uma linha e adequados para alimentar um utilitário baseado em linhas comogrep
e para imprimir em um terminal.fonte
--color=always
aols
, para OSX-G
.sudo chmod 777
no final, e me foi dada erros ... Qualquer ajuda é muito apreciadals -pL | grep -v /
. As-L
referências desreferenciadas adicionam links simbólicos.ls -pdL something* | grep -v /
. A-d
opção adicionada lista os próprios diretórios, não o conteúdo, portanto eles serão excluídos corretamente.Para listar apenas arquivos regulares:
Com links simbólicos (para qualquer tipo de arquivo) incluídos:
Onde o primeiro caractere da lista descreve o tipo de arquivo,
-
significa que é um arquivo comum, pois o link simbólico él
.Debian / Ubuntu
Imprima os nomes de todos os arquivos correspondentes (incluindo links):
Com caminhos absolutos:
Imprima os nomes de todos os arquivos
/etc
que começam comp
e terminam comd
:fonte
ls
não tem opção para fazer isso, mas uma das coisas boas sobre o unix e o linux é que pipelines inelegantes e cansativos podem ser facilmente transformados em scripts, funções ou alias de shell. e estes podem, por sua vez, ser usados em pipelines como qualquer outro programa.(OBSERVAÇÃO: existem alguns problemas de escopo com funções e aliases. Os scripts estão disponíveis para qualquer executável que possa lê-los e executá-los. Aliases e funções estão disponíveis apenas no shell atual - embora o .profile / .bashrc etc de um sub-shell possa redefinir Além disso, um script pode ser escrito em qualquer idioma - incluindo bash / sh, awk, perl, python e outros - o que for melhor para o trabalho ou com o qual você esteja mais familiarizado)
por exemplo
alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'
Adicionei xargs para que você possa usar todas as
ls
opções usuais , por exemplolsf -lrS
Como ele usa
find
, todos os arquivos de ponto normalmente ocultos serão exibidos e todos os nomes de arquivos serão prefixados com ./ - essa é a única diferença que você notará.Você pode excluir arquivos de ponto com,
! -iname '.*'
mas precisará ter duas versões do alias - uma que exibisse arquivos de ponto e outra que não.alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'
Como alternativa, se
lsf
fosse um script em vez de um alias, você poderia analisar as opções (talvez com getopts ou / usr / bin / getopt ou similar) e excluir arquivos de ponto a menos que-a
estivesse presente.fonte
-name
é suficiente, você não precisa-iname
.A opção -F para ls acrescenta * a executáveis, / a diretórios, @ a links simbólicos, = a soquetes e | para FIFOs. Você pode usar o grep para excluir os caracteres de arquivo não regulares da saída e os possui. Isso funcionará em qualquer shell, não apenas no zsh.
Os pontos fracos são:
@
,=
ou|
serão excluídos (mas você realmente não deve ter arquivos com esses caracteres no nome de qualquer maneira)fonte
=
,@
ou|
caracteres.=
é comum em nomes de arquivos ou nomes de arquivos que possuem uma parte codificada em base64 ou imprimível entre aspas.@
nas definições de localidade, para endereços de email e muito mais. É raro que eles apareçam no final do nome do arquivo. (apenas 31 dos 2,2 milhões neste sistema, por exemplo)O manual afirmou que a opção 'f' é apenas contra 'arquivo normal', não tubos, soquetes ou dispositivos de bloco / char, o que significa que você já está fazendo as coisas certas.
fonte
Isso não é particularmente curto, mas você pode transformá-lo em um script ou alias se precisar chamá-lo rapidamente. Usando o comando ls como uma matriz de entrada, chame ls -ld em cada entrada canalizada para grep para excluir diretórios com a saída enviada para nula e, se bem-sucedida, ecoar a entrada original:
Você pode inverter a saída grep e condicional, os mesmos resultados:
fonte
\dev\null
?!?!Esta é uma discussão um pouco antiga, mas a maneira mais limpa de listar apenas arquivos.
fonte
touch "some file name"
para ver um rápido contrals -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'
, deve manipular os arquivos com espaços neles.