4

我正在尝试制作一个脚本来附加所有以 .hash 结尾的文件以由 md5deep 验证。名称中带有空格的文件似乎破坏了这个脚本。

#!/bin/bash
XVAR=""
for f in *.hash
do
    XVAR="$XVAR -x $f "
done
md5deep -e $XVAR -r *

每当我使用名为“O S.hash”的文件运行脚本时,我都会得到

O: No such file or directory

如果我更改XVAR="$XVAR -x $f "XVAR="$XVAR -x \'$f\' "XVAR="$XVAR -x \"$f\" "

md5deep 将输入作为“O”相互渗透

"O: No such file or directory

脚本中变量的回显将 XVAR 显示为-x 'O S.hash'-x "O S.hash"

在 shell 中手动输入命令,例如md5deep -e -x "O S.hash" -r *有效,但如果它在脚本中,则命令似乎中断

4

2 回答 2

3

这不是最好的解决方案,但似乎它会起作用:

find . -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e

这实际上与 OP 想要的并不完全相同,所以这是 Tim Pote 和 Jonathan Leffler 建议的修改:

find . -maxdepth 1 -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e
于 2012-04-29T15:20:02.910 回答
2

现在您知道为什么 Unix 系统上的人们传统上会避免使用包含空格的文件名(以及目录名)——不得不对 shell 进行编程来处理这些名称是一件令人讨厌的事情(礼貌地说)。shell 是为在没有此类名称的系统中使用而设计的。换行符也会引起很多悲伤。

使用bash,到目前为止,您最好的解决方案是使用数组来保存元素,然后"${array[@]}"列出它们;这几乎是微不足道的:

declare -a XVAR

for file in *.hash
do
    XVAR+=("-x" "$file")
done

md5deep -e "${XVAR[@]}" -r *

利用Gordon Davisson提到的数组扩展符号。 有关bash大量数组信息,请参阅参考手册(针对 Bash 4.1)的第 6.7 节“数组”;有关+=运算符,请参阅第 3.4 节“外壳参数”。)

如果由于某种原因你不能使用数组,那么你需要一个程序来转义它的参数,这样 shell 就不会扭曲东西。我有这样一个程序,叫做escape

XVAR=
for file in *.hash
do
    name=$(escape "$file")
    XVAR="$XVAR -x $file"
done
eval md5deep -e $XVAR -r *

使用eval,使用起来很棘手;它有效,但使用数组。

于 2012-04-29T15:35:33.700 回答