Como exibir detalhes do arquivo (tamanho, data, etc.) do comando “locate” do Linux?

5

O (lento) comando “find” do Linux tem uma opção, “-ls”, para exibir tamanho, data, etc., como o comando “ls -l”. Mas o comando "localizar" não parece ter isso. Então, como posso obter a funcionalidade equivalente com a localização?

Eu usei carrapatos para passar a saída de locate para ls, assim:

ls -al 'locate -e somefile'

... que funciona enquanto algum arquivo existir. Mas se algum arquivo não existir, ele me fornecerá uma listagem completa de diretórios.

Se eu fizer isso:

ls -al 'locate -e somefile' thisfileneverexists

... então funciona, se você não se importar com a linha de erro:

ls: cannot access thisfileneverexists: No such file or directory

... o que nos leva à solução óbvia, mas extremamente feia:

ls -al 'locate -e somefile' thisfileneverexists 2>/dev/nul

Isso funciona, mas com certeza há uma maneira melhor!

    
por Dave Burton 19.05.2013 / 14:11

3 respostas

11

Use xargs . Isso leva como entrada uma série de parâmetros e executa uma operação neles:

 locate -eb0P somefile | xargs -r0 ls -ald

xargs irá executar o comando ls -ald usando os resultados dos parâmetros locate as.

A opção -e informa ao locate para verificar se os arquivos encontrados no banco de dados realmente existem e ignora os que não existem.

A opção -b informa ao locate para corresponder apenas aos nomes básicos.

A opção -0 (zero) informa ao locate para gerar delimitadores nulos em vez de espaços em branco (portanto, ele pode manipular nomes de arquivos que contêm espaços em branco)

A opção -P informa ao locate para listar links simbólicos quebrados

A opção -r diz ao xargs para não executar o comando se nada for passado - isto é, quando o locate não retorna nada.

A opção -0 diz ao xargs para esperar nulos em vez de espaços em branco como delimitadores

A opção -a diz ao ls para listar os arquivos que começam com "."

A opção -d diz ao ls para listar os diretórios em vez de seus conteúdos

    
por 19.05.2013 / 14:39
3

Armazene o resultado de locate em uma variável, verifique se ela tem algum valor e, em seguida, visualize isso.

f='locate ...'
[ "$f" ] && ls -al "$f"

O motivo pelo qual você não pode obter essas informações diretamente de locate é porque não está no banco de dados que locate usa.

    
por 19.05.2013 / 14:15
0

Você também pode percorrer a locate output:

locate somefile | while IFS= read -r i; do ls -la "$i"; done
    
por 19.05.2013 / 15:55