Como eu especifico argumentos para retornar todos os arquivos de ponto, mas não. e ..?

6

Normalmente, os arquivos de ponto não são incluídos na expansão de curingas:

% echo *
Applications Desktop Documents Downloads Library Movies Music Pictures Public bin

Se eu pedir explicitamente por arquivos de ponto, eu os obtenho:

% echo * .*
Applications Desktop Documents Downloads Library Movies Music Pictures Public bin . .. .CFUserTextEncoding .DS_Store .Trash .adobe .bash_history .cups .gitconfig .gnupg .history .lesshst .netbeans .scanview.cfg .sqlite_history .ssh .swt .systemmodeler .tcshrc .viminfo

No entanto, eu também obtenho . e .. . Eu não quero esses, por exemplo, se eu estou passando para du -s onde eu quero o tamanho de cada item no diretório. Existe algum padrão que me dê apenas o que está no diretório atual e tudo no diretório atual sem . e .. ?

Eu uso o tcsh.

(Com relação a "Esta questão já pode ter uma resposta aqui": note acima: não esta pergunta não tem uma resposta lá, já que essa resposta só funciona para bash).

    
por Mark Adler 14.05.2013 / 16:51

6 respostas

6

Com tcsh 6.17.01 e acima:

set globdot
du -s -- *

Com os mais antigos:

du -s -- * .[^.]* ..?*

(interessante, isso funciona melhor do que sua contraparte POSIX ( * .[!.]* ..?* ) porque em tcsh (e em zsh em csh emulation ( cshnullglob option)), contrariamente aos shells POSIX, aqueles padrões que não corresponde a nenhum arquivo expandido para nada em vez de eles mesmos)

Com pesquisa padrão:

find . ! -name . -prune -exec du -s {} +

Observe que o GNU du tem uma opção -d para limitar a profundidade em que o uso do disco dir é relatado:

du -ad1
    
por 14.05.2013 / 17:57
3

Você pode usar o comando ls -A para não se inscrever. e .. dentro do comando de substituição:

echo "'ls -A'"
    
por 14.05.2013 / 17:19
2

Eu costumo usar:

du -ks * .[^.]*

Desta forma, . e .. não são correspondidos e devem ser relativamente portáteis.

    
por 14.05.2013 / 17:39
1

Não tenho certeza se existe um tcsh embutido, mas dependendo da versão do arquivo encontrado, há uma solução alternativa como esta:

find -maxdepth 1 -not -name '.' -exec du -s '{}' '+'

Se a sua descoberta não fizer a sintaxe -exec COMMAND {} + , você pode tentar por -print0 / xargs :

find -maxdepth 1 -not -name '.' -print0 | xargs -0 du -s
    
por 14.05.2013 / 17:29
1

Não há uma solução genérica simples, pois é dependente do shell:

Para tcsh ou bash:

echo .[^.]*

Para ksh:

echo .*

No entanto, ele irá falhar no caso de Nykakin (arquivos começando com ..)

Para uma resposta mais genérica, use "grep" ou "find", como em:

ls -a|grep '^\.\(..\|[^\.]\)'

Isso funciona com todas as conchas que conheço e não tem o caso de Nykakin. Também trabalha com aqueles que seguem casos especiais em que outras soluções podem falhar:

.x
.x.
..x.

Isso significa: comece com um ponto, seguido por pelo menos dois caracteres ou um caractere que não seja um ponto.

    
por 14.05.2013 / 22:06
0

uma maneira (mas pode sufocar ou ter efeitos colaterais em nomes de arquivos estranhos, ou seja, arquivos cujo nome contenha uma nova linha! mas também arquivos contendo * ou " ou ... você obtém a imagem ^^. Seja < em> very cuidado se usar essa maneira de listar e usar arquivos)

$ for i in * .* ; do echo $i ; done | egrep -v '^\.$|^\.\.$' > /tmp/list_files_one_by_lines
$ while read a_file ; do echo something on "${a_file}" ; done < /tmp/list_files_one_by_lines

então você deve usar melhor: encontrar

mais exatamente:

encontre. -mindepth 1 -print0 | xargs -0 some_command

por isso:

$ find . | egrep '^\.$|^\.\.$'
.
$ find . -mindepth 1 | grep '^\.$'
$ 

e o uso de -print0 | xargs -0 .... permite cuidar de quase todos os caracteres especiais que podem ocorrer em um nome de arquivo (nova linha, aspas,;, ctrl + z, o nome dele)

    
por 14.05.2013 / 19:37