Ordina i file in ordine alfabetico prima dell'elaborazione


12

Io uso il comando

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

eseguire l'hash di ogni file in una gerarchia di cartelle. Sfortunatamente, sha256sumnon ottiene i nomi dei file findin ordine alfabetico. Come si puo aggiustare?

Vorrei ordinarli prima che vengano sottoposti a hash in modo che vengano sottoposti a hash in ordine alfabetico (questo ha una ragione).


Trova file, pipe per sortordinare l'elenco e pipe per sha256sum
Sergiy Kolodyazhnyy

Ordinamento alfanumerico.
UTF-8

Risposte:


16

Utilizzando alcuni tubi e sort

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

Spiegazione

A partire dal 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 partire dal man sort

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

A partire dal 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.

Esempio

% 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

I valori nella prima colonna sono gli stessi, poiché i file non hanno alcun contenuto nel mio test.


1
Oh si! Null termina invece di newline
user3591723

1

Dovresti essere in grado di reindirizzare l'output da finda sort.


Sì, ma poi non c'è -execinterruttore.
UTF-8

2
Non credo che findabbia alcun modo di alfabetizzare l'output, ma il piping sorte quindi l'utilizzo xargsdarebbe l'output previsto. find . -type f | sort | xargs sha256sum. Anche se avrebbe problemi con le sottodirectory ..
user3591723

Un modo stravagante per gestire le sottodirectory sarebbefind . -type f | awk -F/ '{print $NF, $0}' | sort | awk '{print $2}' | xargs sha256sum
user3591723

Questo stampa l'errore 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

La mia ipotesi è che uno dei tuoi file abbia una sola citazione nel nome
user3591723
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.