Я пытаюсь сгенерировать md5 для каждого файла, у которого нет расширенного атрибута user.comment, а затем проанализировать этот md5 в расширенном атрибуте файла. Мой скрипт работает нормально, но только для имен файлов, в которых нет пробелов.

cd /tank/test
shopt -s nullglob
for f in *.txt
do
  if [[ -n $(getfattr -n user.comment "$f") ]]; then
    continue
  else
    md5=($(md5sum $f))
    setfattr -n user.comment -v "$md5" "$f"
  fi
done

Я видел множество людей, использующих вместо этого команду find , но я не знаю, как заставить ее работать для моего случая.

1 ответ1

0

Ваша главная проблема, как указывает @wigy, в том, что вы не цитируете свою переменную. Это означает, что имя файла с пробелами будет рассматриваться как отдельные файлы. Общее эмпирическое правило заключается в том, что вы всегда должны заключать в кавычки свои переменные, если у вас нет веских причин не делать этого

Тем не менее, вот упрощенная версия вашего скрипта:

#!/usr/bin/env bash

shopt -s nullglob
for f in /tank/test/*txt
do
    [[ -n $(getfattr -n user.comment "$f" 2>/dev/null) ]] ||
        setfattr -n user.comment -v "$(md5sum "$f")" "$f"
done

Использование оболочек оболочки, как вы сделали, как правило, проще и чище, но вот как это сделать с помощью find:

find /tank/test/ -type f -name '*.txt' -print0 |
 while IFS= read -r -d '' f
 do
     [[ -n $(getfattr -n user.comment "$f" 2>/dev/null) ]] ||
         setfattr -n user.comment -v "$(md5sum "$f")" "$f"
 done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .