【发布时间】:2020-09-22 19:49:35
【问题描述】:
我在执行 shell 脚本时遇到了一些麻烦。 这段代码我到现在为止。
echo "Give directory name"
read dirname;
if [ -d "$dirname" ]; then
for filename in "$dirname"/*
echo "Files found: $(find "$dirname" -type f | wc -l)"
do
if [ $(stat -f "%a" "$filename") == "$first" ]; then
echo "Files with ($first) permission is: $filename"
fi
done
fi
当我在终端上运行它时,我可以看到我的计算机要求访问(这意味着我到目前为止做得很好。 整个想法是我搜索文件的权限,并将八进制系统中的这个权限与给定的数字($first)进行比较。 最后,它什么也没显示,脚本从头开始循环。
任何帮助都会很棒。
【问题讨论】:
-
你在什么系统上运行这个?
stat的不同版本采用不同的参数和格式,并且您使用它的方式与我所知道的任何版本都不匹配。此外,为了澄清发生了什么,请尝试将set -x放在脚本的开头,以便在运行时打印它正在执行的操作。顺便说一句,一种可能性是您使用的 shell 不允许在[ ]测试中使用==- 请尝试使用=进行比较。 -
我使用的是 Mac OS,我从终端运行脚本(使用 Microsoft Visual 代码进行编辑)。我用单 = 更改了双 == 并且我在同一个循环上运行。另外,我放了 set -x 并且有数百个结果: [code] + for filename in '"$dirname"/*' ++ stat -f %a 'Downloads/test.pdf' ++ wc -l + '[' 1 == 644 ']' [代码]
-
在 macOS 版本的
stat上,%a获取文件的访问时间,而不是其权限。另外,wc -l来自哪里?您是否定义了一个别名来覆盖普通的stat命令或其他东西? -
wc -l 是第 5 行的代码。我是半小时前添加的(对不起)。它计算目录中的所有文件。你知道我可以使用什么方法来访问八进制权限的文件,然后将它们与第一个整数进行比较?
-
尝试
stat -f "%Lp" "$filename"-- 这是 macOS (/bsd) 格式以获取八进制权限。我还会切换到单个=运算符(这是[ ]测试中的标准)。find ... | wc -l可能没有做你想做的事——它会跳过子目录本身,但将文件包含在子目录中。
标签: bash shell unix terminal permissions