2011-05-31 39 views
3

我希望能使用grep来检查,看看是否权限已正确设置上的文件...我如何在grep中使用“ - ”字符?

我知道下面的情况可能不理想&不简明,因为它可能是,但我个别属性,如车主姓名和权限...

后,我打算用这样的:

cd ~/Desktop 

if [ `ls -a | grep My File.txt | wc -l` -eq 1 ]; 
then 
echo "My File.txt Exists" 

    MYPERMISSIONS=`ls -l My File.txt` 

    if [ `$MYPERMISSIONS | grep $"\-rwxr\-xr\-x" | wc -l` -eq 1 ]; 
     then 
     echo "Permissions are correct for My File.txt" 
    fi 

    if [ `$MYPERMISSIONS | grep $"\-rwxr\-xr\-x" | wc -l` -eq 0 ]; 
     then 
     echo "Permissions are NOT correct for My File.txt" 
    fi 

    if [ `$MYPERMISSIONS | grep root | wc -l` -eq 1 ]; 
    then 
     echo "Owner is correct for My File.txt" 
    fi 

    if [ `$MYPERMISSIONS | grep root | wc -l` -eq 0 ]; 
    then 
     echo "Owner is NOT correct for My File.txt" 
    fi 
fi 

if [ `ls -a | grep My File.txt | wc -l` -eq 0 ]; 
then 
echo "My File.txt does NOT Exist" 
fi 

它看起来像grep的不想要搜索的“ - ”字符.. 。

任何绕过这个方法?

谢谢!

+2

你是怎么推断的grep是无视“ - ”字符? – vinothkr 2011-05-31 05:19:50

回答

3

你的问题不是连字符,而是几个其他的语法错误:你需要回显你的数据以得到它的grep;你不需要用反斜杠去掉连字符;你需要用克拉(这也将避免别人提到的连字符作为参数问题)锚定你的正则表达式。

这里是一个开始:

if [ `echo "$MYPERMISSIONS" | grep "^-rwxr-xr-x" | wc -l` -eq 1 ] 
+0

感谢您的回答! – Mattus 2011-05-31 05:39:30

+0

而不是'| wc -l'你可以使用'grep -c'。 – l0b0 2011-06-01 13:04:41

+0

是的,如果你想减少它,你可以走得更远。您可以摆脱括号和backtics,并使用grep的退出状态,因为他的数据只有一行。但我想我会先解决语法问题。 – 2011-06-01 15:31:55

2

尝试用修改您的grep命令:

if [ ls -a | grep 'My File\.txt' | wc -l -eq 0 ]; then echo "My File.txt does NOT Exist" fi 
5

的问题是, ' - ' 用于指示标志。你可以通过使用grep -e来解决这个问题,强制下一个参数被解释为模式而不是标志。

+0

我不认为这是*这个问题,但这可能是一个问题。 – 2011-05-31 05:21:35

+1

grep“^ - ”...比grep工作得更好“\”... – karmakaze 2011-05-31 12:08:18

2

我不知道你的问题在你的文件名中的空间呢?以下,例如,应该努力 -

ls -l | grep "drwxr-xr-x" 
2

有许多事情错的脚本,只有最明显的事情已经指出,到目前为止,(你需要回声$ MYPERMISSIONS管道它grep,你不需要在权限字符串中的多余转义等,并且你需要文件名中的引号或转义空格)。还有一些微妙的问题,主要是由于dangers of parsing ls's output。例如,假设您的桌面目录中有一个名为“Not My File.txt”的文件 - 初始ls | grep | wc将匹配该文件,并打印“My File.txt Exists”(即使它不存在)(事情甚至更加诡异如果这两个和“我的File.txt”存在)。其次,假设文件存在并且归“notroot”所有 - 脚本会认为它是所拥有的根,因为ls列表包含“root”。第三,假设它的组是“-rwxr-xr-x”(至少在某些系统上是完全合法的组名)...

相反,要测试文件是否存在,请使用test命令的-e原语。为了检查所有权和权限,stat为您提供了更好的表现。

最后,而不是使用多余的if命令(如果文件存在...后跟如果文件不存在...),请在单个if命令中使用else子句。纠正这一切(和一点点小的清理喜欢把文件名中的变量)后,这里就是我已经重写了剧本:

cd ~/Desktop 
filename="My File.txt" 

if [ -e "$filename" ]; 
then 
    echo "My File.txt Exists" 

    if [ "$(stat -f "%Sp" "$filename")" = "-rwxr-xr-x" ]; then 
     echo "Permissions are correct for My File.txt" 
    else 
     echo "Permissions are NOT correct for My File.txt" 
    fi 

    if [ "$(stat -f "%Su" "$filename")" = "root" ]; then 
     echo "Owner is correct for My File.txt" 
    else 
     echo "Owner is NOT correct for My File.txt" 
    fi 

else 
    echo "My File.txt does NOT Exist" 
fi 
+0

+1,大大改进了解决方案。 [不要分析'ls'输出!](http://mywiki.wooledge.org/ParsingLs) – l0b0 2011-06-01 13:06:57