【问题标题】:Comparing the permissions(octal) of files with an integer in Bash Shell将文件的权限(八进制)与 Bash Shell 中的整数进行比较
【发布时间】: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


【解决方案1】:

您可以通过以下方式替换此脚本:

#!/usr/bin/env bash

read -r -p $'Give directory name:\n' dirname
if [ -d "$dirname" ]
then
    read -r -p $'Give expected octal permissions:\n' first
    mapfile -d '' -t files < <(
      find "$dirname" -maxdepth 1 -type f -perm "$first" -print0
    )
    if [ "${#files[@]}" -gt 0 ]
    then
      printf 'Found: %d files with the (%s) permission in %s:\n' "${#files[@]}" "$first" "$dirname"
      printf '%s\n' "${files[@]}"
    else
      printf 'Found no file with the (%s) permission in %s\n' "$first" "$dirname"
    fi
fi

【讨论】:

  • 我更换了它,但它不能正常工作。你知道,我把“read -r first”放在“If else”之外,所以整数是从脚本的开头输入的。现在我想将整数($first)与目录中文件的八进制权限进行比较
猜你喜欢
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多