Eu quero encontrar um comando bash que me permita grep todos os arquivos em um diretório e escreva a saída desse grep em um arquivo separado. Meu palpite teria sido fazer algo assim
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
mas, tanto quanto eu sei, xargs não gosta de aspas duplas. Se eu remover as aspas duplas, no entanto, o comando redirecionará a saída do comando inteiro para um único arquivo chamado '{}'. Out em vez de para uma série de arquivos individuais.
Alguém sabe de uma maneira de fazer isso usando xargs? Eu apenas usei esse cenário grep como um exemplo para ilustrar meu problema com o xargs, para que quaisquer soluções que não usem o xargs não sejam tão aplicáveis para mim.
xargs
sem-0
: isso só se aplica quando você canalizafind
a saídaxargs
, certo? quando eu faço,xargs -a <input_file>
como eu usaria isso? A maioria dos comandos, comogrep
saídas com\n
e não, é\0.
a única maneira de solucionar esse problema, usando-otr
novamente para corrigir isso, talvez. Mas por que é importante usá-lo apenas com-0
?-0
,xargs
pega seus nomes de arquivos e quebra todos os espaços, aspas e barras invertidas neles. Você deve apenas esquecerxargs
como uma ferramenta. Se você tiver linhas, use um loop bash para iterar as linhaswhile read line; do <command> "$REPLY"; done < file-with-lines
command | while ...
xargs
são GNU),xargs
precisa ser evitado, a menos que se possa usá-lo-0
. Obrigado.xargs
, que nem sempre envolve análisels
ou usosh -c
. Isso não responde à pergunta nem um pouco, mas é o primeiro resultado do Google para a pergunta, apenas aumentando a confusão.xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
? Especialmente, as regras de aspas incorporadas (duplas) e o símbolo "-" no final. ObrigadoUma solução sem
xargs
é a seguinte:... e o mesmo pode ser feito com
xargs
:Edit : aspas simples adicionadas após observação por lhunath .
fonte
Suponho que seu exemplo seja apenas um exemplo e que você pode precisar de outras coisas. O GNU Parallel http://www.gnu.org/software/parallel/ pode ser o seu resgate. Ele não precisa de citação adicional, contanto que seus nomes de arquivos não contenham \ n:
Se você tiver nomes de arquivos com \ n:
Como um bônus adicional, você executa os trabalhos em paralelo.
Assista aos vídeos de introdução para saber mais: http://pi.dk/1
A instalação de 10 segundos tentará fazer uma instalação completa; se isso falhar, uma instalação pessoal; se isso falhar, uma instalação mínima:
Se você precisar movê-lo para um servidor que não possua o GNU Parallel instalado, tente
parallel --embed
.fonte