diff dois arquivos de uma saída de comando [closed]

0

Eu tenho um monte de arquivos xml no diretório atual.

Problema 1.

Tanto quanto eu li eval retorna os resultados e armazena em uma variável. Mas recebo um erro com o comando abaixo

find ./ -name '*.xml' | file=$(eval awk '{print $0}') ; echo $file

EDIT (depois de omitir eval como apontado por cas) -

Omitting eval apenas retorna uma string vazia.

find ./ -name '*.xml' | file=$(awk '{print $0}') ; echo $file

Problema 2.

Estou apenas tentando aprender o bash e, portanto, fiz uma sequência complicada de diferenciar os dois primeiros arquivos da saída do find. A sequência complicada é apenas entender os conceitos de programação bash.

find ./ -name '*.xml' | file=$(awk '{print $0}') ; echo $file && diff -y $(sed '2q;d' $file) $(sed '1q;d' $file)
    
por infoclogged 24.01.2018 / 20:10

3 respostas

1

Aqui está um breve exemplo de uma maneira de fazer isso usando uma matriz no bash:

#!/bin/bash

IFS=$'\n' files=( $(find . -name '*.xml' | head -n 2) )

if [[ -n ${files[0]} && -n ${files[1]} ]] ; then
  diff "${files[0]}" "${files[1]}"
fi

Isso executa o comando find ... | head -n 2 , armazena cada linha (os nomes de arquivos retornados) na matriz $files . Se os dois primeiros elementos da matriz (0 e amp; 1) não estiverem vazios, ele será executado com esses nomes de arquivo.

Observe que isso será interrompido se qualquer um dos diretórios ou nomes de arquivos contiver caracteres de nova linha.

    
por 25.01.2018 / 11:45
1

Você pode usar:

diff "$(find . -type f -name 'diff')" "$(find . -type f -name 'diff2')"

Dessa forma, você pode pesquisar o arquivo diff , pesquisar o arquivo diff2 e compará-lo com a ferramenta diff .

    
por 24.01.2018 / 20:27
0

Para expandir a resposta aceita, para um entendimento geral, estou postando minha própria resposta.

Solução para o problema 1.

O primeiro problema é o uso de eval. eval é desnecessário aqui. É o suficiente para fazer uma substituição de comando usando $ (...)

find ./ -name '*.xml' | files=$(awk '{print $0}') ; echo $files

O segundo problema é o pipe. Como apontado por @cas - o pipe é executado em sua própria sub-rede. Portanto, o arquivo variável está vazio. Para resolver isso, remova awk e armazene o resultado de encontrar diretamente na variável.

files=$(find ./ -name '*.xml') ; echo "${files}" 

Mas o comando acima não é uma matriz. Para torná-lo um array, use parênteses.

files=($(find ./ -name '*.xml')) ; echo "${files[0]}" 

deve ser feito. Agora, o uso de aspas duplas na variável $ {files} é uma boa prática, porque, do contrário, espaços em nomes de arquivos criarão problemas. Além disso, a próxima boa prática seria usar o IFS. Isso garante que o shell não divida a palavra em espaços ou tabulações. IFS=$'\n' seria dividido em novas linhas (saída de find) antes de armazenar o conteúdo na variável $ files.

IFS=$'\n' files=($(find ./ -name '*.xml')) ; echo "${files[0]}" 

Então, o comando final para diferenciar os dois arquivos ou quaisquer dois arquivos é

files=($(find . -name '*.sh')) ; echo "${files[0]}" ; diff -y "${files[0]}" "${files[1]}"

Aqui 0 e 1 podem ser substituídos por qualquer um de um número válido na matriz ($ files).

    
por 25.01.2018 / 13:13

Tags