Ordenar archivos alfabéticamente antes de procesar

12

Yo uso el comando

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

para trocear cada archivo en una jerarquía de carpetas. Desafortunadamente, sha256sumno obtiene los nombres de los archivos finden orden alfabético. ¿Cómo se puede arreglar esto?

Me gustaría ordenarlos antes de que se mezclen para que se mezclen en orden alfabético (esto tiene una razón).

UTF-8
fuente
Buscar archivos, canalizar para sortordenar la lista y canalizar a sha256sum
Sergiy Kolodyazhnyy
Tipo alfanumérico.
UTF-8
Ya respondí en unix.stackexchange.com/questions/34325/… .
sampablokuper

Respuestas:

16

Usando algunas tuberías y sort

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

Explicación

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.

Ejemplo

% 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

Los valores en la primera columna son los mismos, ya que los archivos no tienen ningún contenido en mi prueba.

AB
fuente
1
Oh si! Terminación nula en lugar de nueva línea
usuario3591723
1

Debería poder canalizar su salida de finda sort.

usuario3591723
fuente
Sí, pero entonces no hay -execinterruptor.
UTF-8
2
No creo que findtenga ninguna forma de alfabetizar la salida, pero conectarla sorty luego usarla xargsdaría la salida esperada. find . -type f | sort | xargs sha256sum. Aunque tendría problemas con los subdirectorios ..
user3591723
Sería una forma find . -type f | awk -F/ '{print $NF, $0}' | sort | awk '{print $2}' | xargs sha256sum
hacky de
Esto imprime el error 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
Mi conjetura es uno de los archivos tiene una comilla simple en el nombre
user3591723