Classifique os arquivos em ordem alfabética antes do processamento

12

Eu uso o comando

find . -type f -exec sha256sum {} \; > sha256SumOutput

para hash todos os arquivos em uma hierarquia de pastas. Infelizmente, sha256sumnão obtém os nomes dos arquivos findem ordem alfabética. Como isso pode ser consertado?

Eu gostaria que eles fossem encomendados antes de serem hash, para que sejam hash em ordem alfabética (isso tem um motivo).

UTF-8
fonte
Encontrar arquivos, tubo para sortordenar a lista, e tubo para sha256sum
Sergiy Kolodyazhnyy
Classificação alfanumérica.
UTF-8
Já respondeu em unix.stackexchange.com/questions/34325/… .
Sampablokuper

Respostas:

16

Usando alguns tubos e sort

find . -type f -print0 | sort -z | xargs -r0 sha256sum > sha256SumOutput

Explicação

A partir de man find

   -print0
        True; print the full file name on the standard output, followed
        by a null character (instead of the newline character that -print
        uses). This allows file names that contain newlines or other
        types of white space to be  correctly  interpreted by programs
        that process the find output.  This option corresponds to the -0
        option of xargs.

A partir de man sort

   -z, --zero-terminated
        line delimiter is NUL, not newline

A partir de man xargs

   -0   
        Input items are terminated by a null character instead of by
        whitespace, and the quotes and backslash are not special (every
        character is taken literally).  Disables the end of file string,
        which is treated like any  other  argument. Useful when input
        items might contain white space, quote marks, or backslashes.
        The GNU find -print0 option produces input suitable for this mode.

Exemplo

% ls -laog
total 4288
drwxrwxr-x  2 4329472 Aug 17 08:20 .
drwx------ 57   20480 Aug 17 08:20 ..
-rw-rw-r--  1       0 Aug 17 08:15 a
-rw-rw-r--  1       0 Aug 17 08:15 a b
-rw-rw-r--  1       0 Aug 17 08:15 b
-rw-rw-r--  1       0 Aug 17 08:15 c

% find -type f -print0 | sort -z | xargs -r0 sha256sum                  
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  ./a
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  ./a b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  ./b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  ./c

Os valores na primeira coluna são os mesmos, pois os arquivos não têm nenhum conteúdo no meu teste.

AB
fonte
1
Oh sim! Nulo terminar em vez de nova linha
user3591723
1

Você deve conseguir canalizar sua saída de findpara sort.

user3591723
fonte
Sim, mas depois não há -execinterruptor.
UTF-8
2
Eu não acredito que findtenha alguma maneira de alfabetizar a saída, mas canalizar sorte usá-la xargsdaria a saída esperada. find . -type f | sort | xargs sha256sum. Embora teria problemas com subdiretórios ..
user3591723
A maneira Hacky de lidar com os subdiretórios seriafind . -type f | awk -F/ '{print $NF, $0}' | sort | awk '{print $2}' | xargs sha256sum
#
Isso imprime o erro xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option sha256sum: invalid option -- 'l' Try 'sha256sum --help' for more information..
UTF-8
Meu palpite é que um dos seus arquivos tem uma única citação no nome
user3591723