Сортировка файлов по алфавиту перед обработкой

12

Я использую команду

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

хэшировать каждый файл в иерархии папок. К сожалению, sha256sumне получает имена файлов findв алфавитном порядке. Как это можно исправить?

Я бы хотел, чтобы они были заказаны до того, как они будут хэшированы, чтобы они хэшировались в алфавитном порядке (на это есть причина).

UTF-8,
источник
Найти файлы, канал для sortсортировки списка и канал для sha256sum
Сергей Колодяжный
Буквенно-цифровая сортировка.
UTF-8
Уже ответил на unix.stackexchange.com/questions/34325/… .
Сампаблокупер

Ответы:

16

Используя некоторые трубы и sort

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

объяснение

От 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.

От man sort

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

От 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.

пример

% 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

Значения в первом столбце совпадают, так как файлы не содержат никакого содержимого в моем тесте.

AB
источник
1
Ах да! Нулевое значение завершается вместо новой строки
user3591723
1

Вы должны быть в состоянии просто передать свой вывод из findв sort.

user3591723
источник
Да, но тогда нет -execпереключателя.
UTF-8
2
Я не верю, что findесть какой-либо способ алфавитного вывода, но передача sortи последующее использование xargsдаст ожидаемый результат. find . -type f | sort | xargs sha256sum, Хотя у него были бы проблемы с подкаталогами ..
user3591723
Хакерский способ иметь дело с подкаталогами будетfind . -type f | awk -F/ '{print $NF, $0}' | sort | awk '{print $2}' | xargs sha256sum
user3591723
Это печатает ошибку 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
Я предполагаю, что один из ваших файлов имеет одну кавычку в имени
user3591723