2011-05-31 82 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