Я пытаюсь сгенерировать 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
Ваша главная проблема в том,как отметил @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
Использование shell globs, как вы сделали, обычно проще и чище, но вот как это сделать 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