как использовать символ "-" в grep? - PullRequest
3 голосов
/ 31 мая 2011

Я надеялся использовать 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 ]

5 голосов
/ 31 мая 2011

Проблема в том, что «-» используется для обозначения флагов. Вы можете обойти это, используя grep -e, чтобы следующий аргумент интерпретировался как шаблон, а не как флаг.

3 голосов
/ 31 мая 2011

Ваша проблема не в дефисе, а в нескольких других синтаксических ошибках: вам нужно отобразить данные, чтобы получить их в grep; вам не нужно избегать дефисов с обратными слешами; и вам нужно привязать свое регулярное выражение с помощью карата ^ (что также позволит избежать проблемы дефисов в качестве аргументов, упомянутой кем-то другим).

Вот начало:

if [ `echo "$MYPERMISSIONS" | grep "^-rwxr-xr-x" | wc -l` -eq 1 ]
2 голосов
/ 01 июня 2011

В сценарии есть ряд неправильных вещей, и до сих пор указывались только самые очевидные вещи (вам нужно вызвать $ MYPERMISSIONS, чтобы передать его в grep, вам не нужны лишние экранирования и тому подобное в строка разрешений, и вам нужно заключить в кавычки или пробелы в имени файла). Есть также некоторые более тонкие проблемы, в основном из-за опасности анализа вывода ls . Предположим, например, что в вашем рабочем столе есть файл с именем «Not My File.txt» - начальный ls | grep | wc будет соответствовать этому, и выведите «My File.txt Exists», даже если это не так ( еще более странно, если существует и то и «My File.txt». Во-вторых, предположим, что файл существует и принадлежит «notroot» - скрипт будет считать, что является владельцем root, поскольку в списке ls содержится «root». В-третьих, предположим, что его группа - "-rwxr-xr-x" (совершенно допустимое имя группы, по крайней мере, в некоторых системах) ...

Вместо этого, чтобы проверить, существует ли файл, используйте примитив -e тестовой команды. Чтобы проверить владельца и разрешения, stat дает вам намного лучше себя вести.

Наконец, вместо использования избыточных команд if (если файл существует ... и затем, если файл не существует ...), используйте предложение else для одной команды if. После исправления всего этого (и небольшой незначительной очистки, такой как помещение имени файла в переменную), вот как я переписал скрипт:

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
2 голосов
/ 31 мая 2011

Интересно, у вас проблема с пробелом в имени файла? Следующее, например, должно работать -

ls -l | grep "drwxr-xr-x" 
2 голосов
/ 31 мая 2011

Попробуйте изменить ваши команды grep:

if [ ls -a | grep 'My File\.txt' | wc -l -eq 0 ]; then echo "My File.txt does NOT Exist" fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...