Como listar os arquivos no terminal para que possamos ver os tipos de arquivos executáveis, ascii etc?

3

Eu tenho tentado listar arquivos no diretório usando ls e passando diferentes opções para ele.

Ele tem a capacidade de listar tipos de arquivos também? Eu quero saber quais são executáveis, sharedlibs ou apenas arquivos ascii sem fazer o comando de arquivo em arquivos individuais.

    
por Ahmed 22.03.2015 / 10:27

2 respostas

3

ls em si não mostrará esta informação.

Você pode canalizar a saída de find para file -f - , da seguinte maneira:

$ find /usr/local/bin | file -f -
/usr/local/bin:              directory 
/usr/local/bin/apt:                  Python script, ASCII text executable
/usr/local/bin/mint-md5sum:                          ASCII text
/usr/local/bin/search:                     Bourne-Again shell script, ASCII text executable
/usr/local/bin/gnome-help:                         Python script, ASCII text executable
/usr/local/bin/office-vb.sh:                           ASCII text
/usr/local/bin/pastebin:                       Python script, ASCII text executable
/usr/local/bin/highlight:                        POSIX shell script, ASCII text executable
/usr/local/bin/yelp:                   Python script, ASCII text executable

Observe que find é usado em vez de ls , pois imprimirá o caminho completo, enquanto ls somente imprimirá o nome do arquivo. Portanto, se você simplesmente precisar fazer isso com os arquivos em seu diretório atual, então:

ls | file -f -

funcionaria.

    
por 22.03.2015 / 10:53
1

ls não faz isso. Sua tarefa é relatar metadados de arquivos (permissões, registro de data e hora, etc.) e não o conteúdo dos arquivos. Mas file faz (combinado com um caractere curinga para listar todos os arquivos):

file *

para o diretório atual ou

file /some/directory/*

em outro diretório.

Se você quiser combinar informações de metadados e conteúdo de arquivos, combine a saída de ls e file . Uma maneira é organizar dois comandos para listar um arquivo por linha na mesma ordem e usar o paste utilitário para combiná-los - algo como

paste <(ls -dlog -- *) <(file -b -- *)

(Isto usa a substituição de processo, que está disponível em shells interativos comuns: bash, zsh, também em ksh93.) Se você tiver o column utilitário, é uma maneira conveniente de alinhar as colunas:

paste <(ls -dlog -- *) <(file -b -- *) | column -ts $'\t'

Se você deseja produzir os campos em uma ordem diferente, join os campos no nome do arquivo em vez de. Eu faço algumas idas e vindas entre espaços e tabs para lidar com nomes de arquivos contendo espaços e produzir resultados alinhados verticalmente.

join -t $'\t' -1 2 -2 1 <(ls -dlog -- * |
                          sed 's/^\([^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)  */\t/') \
                        <(file -- * | sed 's/: */\t/') |
column -ts $'\t'
    
por 22.03.2015 / 18:38