Filtre uma lista de arquivos com base nos atributos do arquivo

3

Com find você pode pesquisar por atributos de arquivo como -type , -executable etc.

Como conseguir algo semelhante, mas a partir de uma lista existente de arquivos? por exemplo. a saída de dpkg -L <package_name> .

Um canal para ls -ld ou file e, em seguida, para grep não é exato nem correto.

Eu assumo que awk poderia ser usado para analisar a saída de ls -ld para um resultado exato, mas isso parece muito complicado e não uma solução geral verdadeira. O melhor cenário seria se find em si pudesse ser usado para isso.

    
por bolov 08.11.2015 / 22:33

3 respostas

1

Tente:

stat --printf="'%n' is a %F\n" $(dpkg -L grep)

Se você quisesse mostrar somente diretórios, você poderia fazer:

stat --printf="'%n' is a %F\n" $(dpkg -L grep) | grep ' is a directory$'

ou

for f in $(dpkg -L grep)
do
    operms=$(stat --format='0%a' "$f")
    if [ $(( $operms & 0111 )) -ne 0 ]
    then
        echo "$f: executable";
    fi
done

As possibilidades são infinitas!

Eu acho que as duas primeiras formas são geralmente mais desejáveis porque elas só iniciam dois processos; no entanto, o loop for inicia um processo stat para cada arquivo.

Veja a página stat man na seção 1 do manual para todos os atributos que você pode acessar desta maneira.

Obrigado a @ Jeff-Schaller por mencionar stat .

    
por 08.11.2015 / 23:38
0

Você pode usar test de maneira bastante análoga a find , por exemplo,

dpkg -L somepackage | while read -r f; do [ ! -d "$f" -a -x "$f" ] && printf "$f\n"; done

para find ! -type d -executable

    
por 09.11.2015 / 00:55
0

Você pode usar meu pacote dlocate com a opção -lsbin :

por exemplo,

$ dlocate -lsbin gawk
/usr/bin/gawk
/usr/bin/igawk
/usr/lib/x86_64-linux-gnu/awk/grcat
/usr/lib/x86_64-linux-gnu/awk/pwcat

Você pode canalizar isso para xargs ls -l se quiser uma listagem longa.

Eu escrevi dlocate como um wrapper em torno de dpkg e grep-dctrl etc para fazer todas essas pequenas coisas que dpkg não poderia fazer sozinho. também é muito mais rápido em pesquisas do que dpkg -s .

A versão atual de dlocate nos arquivos do Debian faz a comparação entre ls , o que é relativamente seguro neste contexto específico. Uma atualização não lançada até agora usa stat ... provavelmente terminarei de trabalhar nele e começarei a enviá-lo para o Debian até o final do ano.

btw, dlocate também tem (entre outros) -du , -lsconf , -lsman e -md5check opções.

por exemplo,

$ dlocate -lsman gawk
/usr/share/man/man1/gawk.1.gz
/usr/share/man/man1/igawk.1.gz
/usr/share/man/man3/filefuncs.3am.gz
/usr/share/man/man3/fnmatch.3am.gz
/usr/share/man/man3/fork.3am.gz
/usr/share/man/man3/inplace.3am.gz
/usr/share/man/man3/ordchr.3am.gz
/usr/share/man/man3/readdir.3am.gz
/usr/share/man/man3/readfile.3am.gz
/usr/share/man/man3/revoutput.3am.gz
/usr/share/man/man3/revtwoway.3am.gz
/usr/share/man/man3/rwarray.3am.gz
/usr/share/man/man3/time.3am.gz

Você pode canalizar isso direto para xargs man e ler as páginas de manual uma após a outra.

$ dlocate -lsman gawk | xargs man
    
por 09.11.2015 / 01:54

Tags