Eu tenho um diretório chamado uploads
. Ele contém vários arquivos, além de alguns subdiretórios que, por sua vez, contêm arquivos.
Existe uma maneira de eu (em uma etapa) fazer o seguinte:
Listar APENAS os arquivos no diretório de uploads raiz - não quero ver os nomes das subpastas nem seu conteúdo;
e
NÃO liste nenhum arquivo que comece com
t_
Eu sei sobre a -d
bandeira, mas não me dá exatamente o que eu quero.
-exec ls -lG -- {} +
em sua resposta para obter a saída usando opções extras para ls. Você também pode adicionar apenas um-ls
a essa descoberta para obter uma aproximação rápida e suja da visualização detalhada de ls.O GNU ls (ou seja, o comando ls em sistemas Linux não incorporados e o Cygwin, também disponível em outros órgãos) tem uma opção para ocultar alguns arquivos, com base em seus nomes. Porém, não há como ignorar diretórios.
Outra abordagem é fazer com que seu shell faça a correspondência. Bash, ksh e zsh têm um padrão de negação
!(t_*)
para corresponder a todos os arquivos, exceto aqueles correspondentest*
; No bash, esse recurso precisa ser ativadoshopt -s extglob
e, no zsh, precisa ser ativadosetopt ksh_glob
. O Zsh também possui a sintaxe equivalente^t_*
que precisa ser ativadasetopt extended_glob
. Isso ainda não ignora os diretórios. O Zsh possui um recurso extra que permite corresponder arquivos não apenas pelo nome, mas também por metadados e mais: qualificadores glob . Adicione(.)
no final de uma correspondência para restringir a arquivos regulares. A negação^
faz parte da sintaxe de correspondência de nome, portanto,^t_*(.)
significa "todos os arquivos regulares que não correspondemt_*
" e "não todos os arquivos que não correspondem aos arquivos regularest_*
".Se você se encontrar sem ferramentas avançadas, poderá fazer isso em qualquer unix com
find
. Não é o tipo de coisa que você normalmente digita na linha de comando, mas é poderoso e preciso. Caleb já mostrou como fazer isso com o GNU find . A-maxdepth
opção não é portátil; você pode usar-prune
, em vez disso, para pararfind
de recorrer com portabilidade.Substitua
-print
por-exec ls -lG -- {} +
para executarls
com suas opções favoritas nos arquivos.Todos os comandos acima ocultam arquivos de ponto (ou seja, arquivos cujo nome começa com a
.
). Se você deseja exibi-los, passe-A
parals
ou adicione oD
qualificador glob em zsh (ls uploads/^t_*(.D)
). Comfind
, você pode usar uma abordagem diferente para fazer com que ela recorra apenas um nível (find
não trata especialmente os arquivos de ponto). Isso só funciona totalmente se você executarfind
no diretório atual.fonte
-maxdepth
deve funcionar, mas o problema de "portabilidade" a que Gilles se refere é que o BSDfind
(também encontrado no OSX, eu acho) é um animal um pouco diferente, então você pode precisar da resposta dele também. @Gilles: +1 para o truque zsh!prune
s me vêm à mente, mas eu deixarei para lá dizendo simplesmente que, quando estou mexendo em meus próprios sistemas, o número de vezes que o pensamento " esse comando funcionaria se eu estivesse em AIX, Solaris ou MINIX3 "está aproximadamente ... em espera ... Estou tendo dificuldade em ler um medidor ... a tela está congelada0.00
.ls
tem uma--use-telepathy
opção? Essa é a maneira mais rápida de exibir apenas os arquivos que você deseja. Talvez não seja portátil.fonte
$9
nesta declaração?ls
saída .print
$ NF` seria mais melhor, IMO. $ NF significa número de campos, que seria 9 e é um uso comum no AWK como uma boa oportunidade para ensinar aos outros sobre $ NF.fonte
find
?Deixe-me dar uma chance usando
ls
e tubos:digamos que a última coluna é a 9ª.
fonte
Se um problema de portabilidade -maxdepth da find for um problema, você pode usar:
Não sou especialista, mas acho que isso deve funcionar. Suponho que parece um pouco enigmático, mas se você fala mal, na verdade não é. $ NF pode ser usado em vez de $ 9. Você também pode fazer:
que faz a mesma coisa (mas talvez com menos eficiência do que o anterior ???).
Na verdade, depois de pensar nos outros posts, parece que
é uma maneira ainda mais curta e clara.
Alguém por favor me corrija se eu estiver errado. :-)
fonte
ls
geralmente não é uma boa ideia . Seus truques do awk falharão com nomes de arquivos com espaços em branco, por exemplo.Eu encontrei estas maneiras curtas:
ou
fonte
Tente este alias e use-o:
fonte
ls -hLlF
mostra os subdiretórios e mostra os arquivos começando comt_
. Então, como isso responde à pergunta?Mole-mole:
ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d
fonte