Substitua a saída multilinha '…' do comando find [duplicate]

1

Eu preciso substituir a saída do comando find por outro comando para processar todos os arquivos encontrados, por exemplo:

mdls 'find ~/target_dir/ -iname '*some*' -depth 1'

( mdls é um comando no OS X que obtém atributos de metadados do arquivo especificado. Ele não suporta piping, portanto, find ... | mdls falha.)

O comando acima funciona bem, mas provavelmente falha em arquivos com espaços no nome. Eu pensei que adicionando citações via sed ajuda com isso:

$ find ~/target_dir/ -iname '*some*' -depth 1 | sed 's/\(.*\)/""/'
"/Users/shau-kote/target_dir//secondsomefile"
"/Users/shau-kote/target_dir//some file with spaces in name"
"/Users/shau-kote/target_dir//somefile"

Alack, agora meu comando mdls falha em todos os arquivos:

$ mdls 'find ~/target_dir/ -iname '*some*' -depth 1 | sed 's/\(.*\)/""/''
"/Users/shau-kote/target_dir//secondsomefile": could not find "/Users/shau-kote/target_dir//secondsomefile".

Como posso corrigi-lo para que mdls processe corretamente todos os nomes de arquivos de find ?

Obrigado.

P.S. Não tenho certeza se é importante ou evidente, mas

mdls "/Users/shau-kote/target_dir//secondsomefile"

funciona corretamente.

    
por shau-kote 07.04.2016 / 08:02

1 resposta

1

Use o comando find -exec :

find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} \;

Isso executará mdls em cada nome de arquivo correspondente encontrado por find . Ele funcionará com qualquer nome de arquivo, mesmo aqueles contendo espaços ou novas linhas, etc.

se mdls puder trabalhar com vários nomes de arquivos na linha de comando, você poderá finalizar o comando -exec com + em vez de \; . por exemplo,

find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} +
    
por 07.04.2016 / 08:23