从Bash脚本中的文件参数打印权限

时间:2013-11-12 01:01:21

标签: linux bash

我无法读取文件参数的权限。我看起来它与隐藏文件有关,但我不确定原因。

当前代码:

#!/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$

循环中发生了什么?

2 个答案:

答案 0 :(得分:1)

这是你的grep:

ls -l | grep 'test2*'

这将以test开头,因为你基本上要求以test开头的任何内容可能以0或更多2 s结尾,这是由2*

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

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

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

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

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

答案 1 :(得分:1)

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

ls -l | grep test

并且看到的条目多于ls -l test*所获得的条目。

在你的循环中,你应该只使用:

ls -ld "$file" | cut -d' ' -f1