Diff 2 arquivos ignorando partes de linhas

4

Eu gostaria de diferenciar um sistema de arquivos. Atualmente meu script bash imprime o sistema de arquivos recursivamente em um arquivo (ls -l -R) e o difere com uma saída esperada.

Um exemplo para uma linha neste arquivo seria: drw ---- 100000f3 00000400 0 ./foo /

Meu comando diff atual é diff "$ TEMP_LOG" "$ DIFF_FILE_OUT" --strip-trailing-cr --changed-group-format = '% >' --unchanged-group-format = '' > > "$ SubLog"

Como você pode ver, eu ignoro linhas adicionais no arquivo de saída atual, apenas me importo com linhas que combinam com a saída principal.

Agora tenho o problema de alguns arquivos serem diferentes em tamanho ou uma pasta pode até ter um nome diferente, mas devido a sua localização, eu sei quais direitos de acesso ela deve ter.

Por exemplo:

Output:

------- 00000000 00000000      528 ./foo/bar.txt

Master:

------- 00000000 00000000      200 ./foo/bar.txt

Apenas o tamanho difere aqui, e isso não importa, eu gostaria de simplesmente ignorar certas partes do diff, como um comentário ansioso.

Master:
------- 00000000 00000000      /*200*/ ./foo/bar.txt

- OU -

Master:
d------ 00000000 00000000        /*10*/ ./foo//*123123*///*76456546*//bar.txt

Output:
d------ 00000000 00000000        0 ./foo/asd/sdf/bar.txt

E ainda tem diff corretamente.

Isso é possível mesmo com o diff, ou terei que escrever um script personalizado para ele? Como sou relativamente novo no cygwin, posso estar usando a ferramenta totalmente errada, estou feliz por qualquer sugestão.

Atualização 1:

Dando um passo atrás, aqui está a tarefa geral que eu quero alcançar. Eu quero escrever um script que verifica o sistema de arquivos para ver se as permissões de leitura / gravação estão configuradas corretamente. A estrutura do sistema de arquivos está sob meu controle, então eu não tenho que me preocupar com isso mudar muito. Às vezes, pastas / arquivos podem não estar presentes, mas, se forem suas permissões, devem ser verificados.

Por exemplo, suponha que o seguinte é um instantâneo da estrutura atual do sistema de arquivos

drw ./foo
drw ./foo/bar
-rw ./foow/bar/bar.txt
drw ./foo/baz
-rw ./foo/baz/baz.txt

E isso é o que a estrutura do sistema de arquivos pode ditar, ou seja, se essas pastas / arquivos estiverem presentes, as permissões devem corresponder.

drw ./foo
drw ./foo/bar
-rw ./foo/bar/bar.txt
--- ./foo/bar/foobar.txt
drw ./foo/baz
-rw ./foo/baz/foobaz.txt

Nesse caso, o sistema de arquivos fez check-out ok, já que todos os arquivos presentes correspondem aos valores esperados. A situação se torna mais complicada assim que certas pastas podem ter qualquer nome arbitrário, apenas devido à sua localização eu sei quais devem ser suas permissões. Suponha que o diretório ./foo/bar no exemplo acima seja assim, ou seja, em vez de bar, a pasta poderia ter qualquer nome, mas ainda assim corresponder às permissões -rw.

Esta parece ser uma situação muito complicada, e eu nem tenho certeza se posso resolvê-la apenas com script bash. Eu posso ter que escrever um aplicativo real.

Atualização 2:

Por favor, note que não consigo executar ferramentas diretamente no sistema de arquivos . Tudo o que tenho é um arquivo contendo a saída do comando 'ls -l' R 'que produz a saída como acima.

Eu adicionei uma análise adicional da saída, a saída do sistema / mestre agora tem o formato

d------ ./path
drw---- ./path2
    
por Millianz 05.04.2012 / 19:17

3 respostas

1

Talvez seja mais fácil abusar de rsync para obter o que você está procurando e potencialmente fazer toda a tarefa, embora você tenha que suprimir seu desejo de atualizar o arquivo - essa é a rotina do rsync:

  • rsync --existing -iprvn a/ b

As opções são as seguintes:

        --existing              skip creating new files on receiver
    -p, --perms                 preserve permissions
    -i, --itemize-changes       output a change-summary for all updates
    -r, --recursive             recurse into directories
    -v, --verbose               increase verbosity
    -n, --dry-run               perform a trial run with no changes made

Agora vamos criar um teste. Aqui temos dois diretórios, ambos possuem um arquivo que o outro não possui; b também tem a+x em 1 .

$ ls -lah a/ b/
a/:
total 8.0K
drwxrwxr-x  2 ecarroll ecarroll 4.0K Apr  5 16:38 .
drwxr-xr-x 71 ecarroll ecarroll 4.0K Apr  5 16:38 ..
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 1
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 2
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 5

b/:
total 8.0K
drwxrwxr-x  2 ecarroll ecarroll 4.0K Apr  5 16:52 .
drwxr-xr-x 71 ecarroll ecarroll 4.0K Apr  5 16:38 ..
-rwxrwxr-x  1 ecarroll ecarroll    0 Apr  5 16:52 1
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:52 5
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 7

Agora vamos executar um rsync.

$ rsync --existing -icprvn a/ b
sending incremental file list
.f...p..... 1

sent 97 bytes  received 15 bytes  224.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
  • f significa que é um arquivo.
  • p significa que as permissões estão desativadas.
  • 1 é apenas o nome do meu arquivo de exemplo.
por 06.04.2012 / 00:09
-1

Acho que tudo que você precisa é:

find . -type f -printf "%M %p\n"

Dado que, você provavelmente pode escrever em um arquivo e usar diff.

link

    
por 05.04.2012 / 23:31
-1

Se você quiser apenas a parte de permissões de ls , poderá analisá-la apenas com awk .

ls -l your-file | awk '{print $1;}'

Como alternativa, você pode verificar as permissões em um script PHP usando a função fileperms .

    
por 05.04.2012 / 20:30