md5sum 弄乱了带有空格的文件名

md5sum 弄乱了带有空格的文件名

我正在尝试为每个没有 user.comment 扩展属性的文件生成一个 md5,然后在文件的扩展属性中解析该 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

相关内容