md5sum портит имена файлов с пробелами

668
Weekender

Я пытаюсь сгенерировать 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команду вместо этого, но я не знаю, как заставить ее работать для моего случая.

0
Это помогает добавить "" вокруг $ f? Как в `md5sum" $ f "` wigy 8 лет назад 2
Святой! Ты мужчина, лол Не могу поверить, что я пропустил это, спасибо большое :) Weekender 8 лет назад 0
;) Продолжайте писать сценарии! wigy 8 лет назад 0

1 ответ на вопрос

0
terdon

Your main problem is, as pointed out by @wigy, that you're not quoting your variable. This means that a file name with whitespace will be treated as separate files. The general rule of thumb is that you should always quote your variables unless you have a very good reason not to.

That said, here's a simplified version of your script:

#!/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 

Using shell globs, as you did, is generally simpler and cleaner but here's how to do it with 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 

Похожие вопросы