0

我无法读取文件参数的权限。我看起来它与隐藏文件有关,但我不知道为什么。

当前代码:

#!/bin/bash

if [ $# = 0 ]
then
    echo "Usage ./checkPerm filename [filename2 ... filenameN]"
    exit 0
fi

for file in $@
do
    ls -l | grep $file | cut -f1 -d' '

    # Do Something

done

我可以获得每个输入的权限,但是当隐藏文件通过循环运行时,它会重新打印所有文件的权限。

-bash-4.1$ ll test*
-rw-r--r-- 1 user joe 0 Nov 11 19:07 test1
-r-xr-xr-x 1 user joe 0 Nov 11 19:07 test2*
-r--r----- 1 user joe 0 Nov 11 19:07 test3
-rwxr-x--- 1 user joe 0 Nov 11 19:07 test4*
-bash-4.1$ ./checkPerm test*
-rw-r--r--
-rw-r--r--
-r-xr-xr-x
-r--r-----
-rwxr-x---
-r--r-----
-rw-r--r--
-r-xr-xr-x
-r--r-----
-rwxr-x---
-bash-4.1$

循环中发生了什么?

4

2 回答 2

1

当您执行ls -l内部循环然后grep执行结果时,如果test1名称中包含文件,但开头不包含文件,则它们会被 选择grep,从而为您提供额外的结果。您可以通过以下方式看到:

ls -l | grep test

并看到比您获得的 4 个条目要多得多ls -l test*

在您的循环中,您可能应该只使用:

ls -ld "$file" | cut -d' ' -f1
于 2013-11-12T01:23:24.953 回答
1

这是你的 grep:

ls -l | grep 'test2*'

这将排除任何以开头的内容,test因为您基本上是在要求以 0 或更多stest结尾的任何内容,如.22*

要获得预期的结果,只需删除循环并将其替换为:

ls -l "$@" | cut -d' ' -f1

或者保留你的循环,但删除 grep:

ls -l $file | cut -d' ' -f1

此外,从技术上讲,这些文件都不是隐藏的。bash 中的隐藏文件以 开头.,例如.bashrc.

于 2013-11-12T01:20:34.140 回答