Сортування файлів в алфавітному порядку перед обробкою


12

Я використовую команду

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

хешувати кожен файл у ієрархії папок. На жаль, sha256sumімена файлів не надходять findза алфавітом. Як це можна виправити?

Я хотів би замовити їх до того, як вони будуть хешировані, щоб вони були хешовані в алфавітному порядку (це є причина).


Знайдіть файли, трубу для sortсортування списку та трубу до sha256sum
Сергій Колодяжний,

Буквено-цифровий сорт.
UTF-8,

Вже відповіли на unix.stackexchange.com/questions/34325/… .
sampablokuper

Відповіді:


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

Значення в першому стовпці однакові, оскільки файли не містять вмісту в моєму тесті.


1
О так! Нульове завершення замість нового рядка
user3591723

1

Ви повинні бути в змозі тільки труби вашого виходу з findдо sort.


Так, але тоді -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,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.