Linux equivalente do comando windows cmd

1

Estou migrando para o Linux e preciso converter o seguinte comando cmd do Windows:

fc file1.txt file2.txt | find /i "no se han encontrado diferencias" > nul && set equal=yes

Acho que fc pode ser substituído por diff ou comm , find com grep , mas não sei como fazer a parte && , talvez uma declaração if . .

    
por kurokirasama 29.06.2018 / 18:20

3 respostas

9

Sabendo o que esses comandos do Windows fazem, eu diria que o equivalente em um script POSIX sh seria:

equal=no
cmp -s file1 file2 && equal=yes

que definiria a variável equal como yes se os dois arquivos puderem ser lidos e tiverem conteúdo idêntico (byte a byte).

Como alternativa ao cmp -s , em alguns sistemas, incluindo os baseados no Linux, você pode usar diff -q . diff -q ( q para quiet ), ao contrário da maioria cmp -s ( s para silencioso ), reportaria uma mensagem de erro se algum dos arquivos não pudesse ser lido. Embora as implementações GNU de diff e cmp primeiro verifiquem se os dois arquivos são caminhos para o mesmo arquivo (incluindo links rígidos ou simbólicos um do outro) ou se são de tamanhos diferentes para salvar a necessidade de lê-los , a implementação busybox de cmp não faz enquanto busybox diff faz. Portanto, nesses sistemas que usam busybox , você pode preferir diff -q por motivo de desempenho.

    
por 29.06.2018 / 18:35
3

Seu comando do windows parece comparar dois arquivos com o comando fc e procura na saída por uma mensagem "sem diferenças"; se virmos essa mensagem, defina a variável equal para yes .

O comando unix cmp pode ser usado para comparar arquivos, e ele retorna zero se eles corresponderem, e nós podemos testar isso diretamente, então não há necessidade de uma função de "busca de saída".

[[ -z "$(cmp file1 file2 2>&1)" ]] && equal=yes
    
por 29.06.2018 / 18:33
2

No shell bash , o operador && é um controle lógico e de processo, permitindo que um segundo processo seja executado se o primeiro processo não sair com erros. Um pipe duplo ( || ) é semelhante, mas é uma instrução OR e será executado se o comando anterior não tiver êxito.

Então, um arquivo chamado sample_file com o conteúdo de:

aaa
bbb
123
ccc
ddd

O comando

grep ccc sample_file >/dev/null && echo found || echo not found

Será ecoado "encontrado" e este -

grep cow sample_file >/dev/null && echo found || echo not found

O echo "não encontrado"

Simplesmente substitua as instruções de eco pela sua atribuição de variável.

    
por 29.06.2018 / 18:32