Localização correta para canalizar e redirecionar a saída em find -exec?

0

Estou usando find com a opção -exec no console, no FreeBSD (por exemplo, find . -exec sha1 {} \; ).

  1. Como eu coloco corretamente (e se necessário, escape) redirecionamento e outros símbolos de controle de execução que podem se aplicar sintaticamente a qualquer um dos comandos exec ou find, como > > > | e & amp ;, onde posso querer que o símbolo se aplique aos comandos find ou exec em diferentes ocasiões?

  2. No mesmo tema, qual é a sintaxe se eu quiser usar tee para exibir a saída dos comandos -exec no console (para observar o progresso) e também anexado a um arquivo (para uso posterior )?

(Eu sei que os shells variam, mas esperamos que os shells mais usados, como sh / csh, sejam bastante similares?)

Atualização:

Em parte, quero saber se aninhado find -exec pode ser feito sem script, como um comando simples. Aqui está o caso de uso que gerou a questio:

  • outer find : encontre todos os subdiretórios correspondentes a DIR_MATCH_TEXT em DIR1
  • inner find : para cada subdiretório correspondente localizado no loop externo (chame-o de DIR2), execute o comando% find DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; >> DIR1/DIR2_hashes.txt

O objetivo é criar um conjunto de arquivos, um para cada subdiretório correspondente, contendo a saída de alguma ação find -exec nesse subdiretório.

Com isso quero dizer que, se /backups contiver /jan2017 e /feb2017 , o resultado será dois arquivos em /backups/jan2017_hashes.txt e /backups/feb2017_hashes.txt , com jan2017_hashes.txt contendo a saída de sha1 for ( digamos) todos os arquivos .pdf em /backups/jan2017 e feb2017_hashes.txt contendo a saída de sha1 para todos os arquivos .pdf em /backups/feb2017 .

De respostas até agora eu reunir o exterior find teria que usar uma chamada de shell como o argumento para -exec

    
por Stilez 03.10.2017 / 17:13

1 resposta

2

O redirecionamento e a tubulação de E / S são funções de shells (por exemplo, bash). Observando o código-fonte do comando find ( link ), a opção -exec é forjada e executa diretamente o dado comando, ele não o envia através de qualquer shell. Dado que, sem ajuda, você não pode incluir tubulação e redirecionamento no argumento para find .

Você pode, no entanto, ter find invocar um shell e fazer com que esse shell, por sua vez, invoque seu comando. Ao executar o mesmo através de um shell, você tem acesso às operações de redirecionamento de E / S expostas pelo shell. Considere, por exemplo:

find . -type f -exec bash -c 'ls -l $0 >> /tmp/result' {} \;

Isso executará ls -l em cada arquivo encontrado por find (o shell refere-se a esse arquivo neste contexto como $0 ) e redirecionará a saída para /tmp/result . Observe que usei >> em vez de > . Aqui, find está chamando um shell para cada arquivo, então > resultará em cada resultado sobrescrevendo o anterior - você terminará com um arquivo que contém apenas a saída do último comando.

O Pipes funcionará também, com a mesma limitação de "um exec por arquivo".

find . -type f -exec bash -c "ls -l $0 | grep something" {} \;

Tudo o que foi dito, não está imediatamente claro para mim por que você deseja aplicar o redirecionamento dentro do contexto do -exec , ou o que você compraria ao executar o redirecionamento na saída de encontrar-se.

    
por 06.10.2017 / 06:50