我如何在grep中使用“ - ”字符?

时间:2011-05-31 05:13:56

标签: bash 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不想搜索“ - ”字符......

绕过这个的任何方式?

谢谢!

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

你的问题不是连字符,而是其他一些语法错误:你需要回显你的数据才能将它变成grep;你不需要用反斜杠来逃避连字符;并且您需要使用克拉^来锚定正则表达式(这也将避免其他人提到的连字符作为参数问题)。

这是一个开始:

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

答案 2 :(得分:2)

尝试使用以下命令修改grep命令:

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

答案 3 :(得分:2)

我想知道您的问题是否是文件名中的空格?例如,以下内容应该有效 -

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

答案 4 :(得分: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文件不存在......),请在单个{{1}上使用else子句命令。在纠正所有这些之后(以及将文件名放在变量中进行一些小的清理),这就是我如何重写脚本:

if