O script Bash se comporta de forma confusa

0

Estou usando este script bash para verificar se o conteúdo de dois caminhos install e install1 transmitidos como argumentos é o mesmo:

#!/bin/sh
du -a $1 | grep -Po "[0-9]+\t$1/\K.*" | sort -n > list.txt
du -a $2 | grep -Po "[0-9]+\t$2/\K.*" | sort -n > list1.txt
cmp list.txt list1.txt

Estou executando o script desta maneira:

./compare-folders install install1

E a comparação entre as listas de arquivos está falhando:

list.txt list1.txt differ: byte 3557704, line 37504

Qual deve significa que pelo menos um arquivo presente em uma pasta está faltando na outra pasta.

Eu verifiquei as diferenças entre list.txt e list1.txt usando difusa e faltam algumas linhas em comparação com as outras. A primeira linha que falta em list.txt , mas está presente em list1.txt (ou seja, o primeiro arquivo aparentemente não presente em install mas presente em install1 ) é:

 Windows/WinSxS/amd64_microsoft-windows-g..cy-script.resources_31bf3856ad364e35_6.3.9600.16384_it-it_b734f6cc26342351/gpscript.dll.mui

Mas o arquivo está presente nas duas pastas. O mesmo para outros dois arquivos que me preocupei em verificar.

O que é estranho sobre isso é que a escolha das linhas a serem descartadas é aparentemente aleatória, enquanto a execução do script várias vezes sempre produz o mesmo resultado exato.

Estou classicamente faltando algo idiota. Eu estou tentando resolver o que é, mas a partir de agora sem sorte.

    
por kos 24.03.2015 / 21:14

1 resposta

2
du -a $1 | grep -Po "[0-9]+\t$1/\K.*" | sort -n > list.txt

Você está removendo o tamanho do arquivo com seu comando grep, e então você está classificando o resultado numericamente. Isso não parece certo.

Que tal tentar

du -a "$1" | sort -n | grep -Po "[0-9]+\t\Q$1\E/\K.*" > list.txt

Eu adicionei \Q e \E em torno da variável para tratá-la como uma string literal, mesmo que contenha caracteres regex especiais

    
por glenn jackman 24.03.2015 / 21:28