Sortieren Sie die Dateien vor der Verarbeitung alphabetisch

12

Ich benutze den Befehl

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

jede Datei in einer Ordnerhierarchie zu hashen. Erhält sha256sumdie Dateinamen leider nicht findin alphabetischer Reihenfolge. Wie kann das behoben werden?

Ich möchte, dass sie bestellt werden, bevor sie gehasht werden, damit sie in alphabetischer Reihenfolge gehasht werden (dies hat einen Grund).

UTF-8
quelle
Finden Sie Dateien, Pipe, sortum die Liste zu sortieren, und Pipe zu sha256sum
Sergiy Kolodyazhnyy
Alphanumerische Sortierung.
UTF-8
Bereits beantwortet unter unix.stackexchange.com/questions/34325/… .
Sampablokuper

Antworten:

16

Mit einigen Rohren und sort

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

Erläuterung

Von 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.

Von man sort

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

Von 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.

Beispiel

% 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

Die Werte in der ersten Spalte sind dieselben, da die Dateien in meinem Test keinen Inhalt haben.

AB
quelle
1
Oh ja! Null beenden statt newline
user3591723
1

Sie sollten in der Lage sein, Ihre Ausgabe von findzu leiten sort.

user3591723
quelle
Ja, aber dann gibt es keinen -execSchalter.
UTF-8
2
Ich glaube nicht, dass findes eine Möglichkeit gibt, die Ausgabe zu alphabetisieren, aber das Weiterleiten an sortund die anschließende Verwendung xargswürde die erwartete Ausgabe ergeben. find . -type f | sort | xargs sha256sum. Obwohl es Probleme mit Unterverzeichnissen geben würde ..
user3591723
Hacky Weg, um mit Unterverzeichnissen umzugehen wärefind . -type f | awk -F/ '{print $NF, $0}' | sort | awk '{print $2}' | xargs sha256sum
user3591723
Dies gibt den Fehler aus 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
Ich vermute, eine Ihrer Dateien hat ein einfaches Anführungszeichen im Namen
user3591723