Как получить вывод md5, но через табуляцию? - PullRequest
1 голос
/ 28 апреля 2020

Я могу использовать md5 -r foo.txt > md5.txt для создания текстового файла с md5 файла, за которым следует пробел, а затем локальный путь к этому файлу ... но как мне go получить эти два элемента, разделенные TAB символ?

Для справки и контекста я использую полную команду:

find . -type f -exec \
  bash -c '
    md=$(md5 -r "$0")
    siz=$(wc -c <"$0")
    echo -e "${md}\t${siz}"
  ' {} \; \
  > listing.txt

Обратите внимание, что элемент filepath вывода md5 также может содержать пробелы как ./path to file/filename, и они не должны быть преобразованы во вкладки.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2020

sed - это еще один вариант:

find directory/ -type f -exec md5 -r '{}' '+' | sed 's/ /\t/' > listing.txt

Это заменит первый пробел в каждой строке на вкладке.

(Обратите внимание, что файл, на который вы перенаправляете вывод, должен не находиться в дереве каталогов, которое ищет find)

2 голосов
/ 28 апреля 2020

Попробуйте расширение встроенного параметра printf и PE, чтобы разделить переменную md.

find . -type f -exec sh -c '
  md=$(md5 -r "$0") siz=$(wc -c <"$0")
  printf "%s\t%s\t%s\n" "${md%% *}" "${md#*"${md%% *}"}" "${siz}"
' {} \; > listing.txt

Выход

d41d8cd98f00b204e9800998ecf8427e        ./bar.txt              0
d41d8cd98f00b204e9800998ecf8427e        ./foo.txt              0
d41d8cd98f00b204e9800998ecf8427e        ./more.txt             0
d41d8cd98f00b204e9800998ecf8427e        ./baz.txt              0
314a1673b94e05ed5d9757b6ee33e3b1        ./qux.txt              0
  • См. Онлайн руководство по bash ParameExpansion

  • Местные справочные страницы, если таковые имеются. PAGER='less +/^[[:space:]]*parameter\ expansion' man bash

1 голос
/ 28 апреля 2020

Похоже, у вас просто есть пробелы между ha sh и именем файла, которые вам не нужны. Быстрый проход через awk может очистить это для вас. По умолчанию вводимый разделитель awk представляет собой любое количество пробелов. Все, что вам нужно, - это запустить awk и распечатать поля с новым OFS (разделителем выходных полей). Фактически, это делает пропуск через echo бессмысленным.

time find . -type f -exec bash -c 'md=$(md5 -r "$0"); siz=$(wc -c <"$0"); awk -vOFS="\t" "{print \$1,\$2,\$3}" <<< "${md} ${siz}" ' > listing.txt {} \;

Лично я бы запустил вывод этой команды поиска в какое-то время l oop. Это в основном то же самое, что и выше, но немного легче следовать.

time find . -type f | \
while read -r file; do
    md=$(md5 -r "$file")
    siz=$(wc -c < "$file")
    awk -vOFS="\t" '{print $1,$2,$3}' <<< "${md} ${siz}"
done > listing.txt
...