Trier les fichiers par ordre alphabétique avant de les traiter

12

J'utilise la commande

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

pour hacher chaque fichier dans une hiérarchie de dossiers. Malheureusement, sha256sumles noms de fichiers ne sont pas obtenus findpar ordre alphabétique. Comment résoudre ce problème?

Je voudrais les commander avant de les hacher afin qu'ils soient hachés par ordre alphabétique (cela a une raison).

UTF-8
la source
Rechercher des fichiers, diriger vers sortpour trier la liste et diriger vers sha256sum
Sergiy Kolodyazhnyy
Tri alphanumérique.
UTF-8
Déjà répondu sur unix.stackexchange.com/questions/34325/… .
sampablokuper

Réponses:

16

En utilisant des tuyaux et sort

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

Explication

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.

De man sort

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

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.

Exemple

% 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

Les valeurs de la première colonne sont les mêmes, car les fichiers n'ont aucun contenu dans mon test.

UN B
la source
1
Oh oui! Null terminate au lieu de
newline
1

Vous devriez pouvoir simplement diriger votre sortie de findvers sort.

user3591723
la source
Oui, mais il n'y a pas d' -execinterrupteur.
UTF-8
2
Je ne crois pas qu'il y findait un moyen d'alphabétiser la sortie, mais la tuyauterie sortpuis l'utilisation xargsdonneraient la sortie attendue. find . -type f | sort | xargs sha256sum. Bien qu'il y ait des problèmes avec les sous-répertoires ..
user3591723
Un moyen hacky de gérer les sous-répertoires seraitfind . -type f | awk -F/ '{print $NF, $0}' | sort | awk '{print $2}' | xargs sha256sum
user3591723
Cela imprime l'erreur 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
Je suppose que l'un de vos fichiers a une seule citation dans le nom
user3591723