3

Находясь в командной строке, я обнаружил, что мне приходится очень часто вводить эту команду:

find . -iname "*php" -exec grep -H query {} \;

Я хотел бы настроить псевдоним, сценарий или ярлык, чтобы сделать его проще. Я хотел бы сделать что-то вроде:

mysearch query ("*php") (.)

Было бы здорово, если бы команда могла принимать три аргумента в обратном порядке:

query string, file name expression, directory

Если вторые два аргумента были опущены, они по умолчанию не будут включены, и текущий каталог.

Наконец, изюминка в торте заключается в том, что, если будут включены дополнительные переменные (4-е, 5-е, 6-е ...), они будут вставлены как дополнительные аргументы для команды поиска (как я мог бы сказать -type d) в конце.

Попытка кода

Я попробовал приведенный ниже пример, но все еще не могу установить значения по умолчанию. Что я делаю неправильно?

#!/bin/bash
c=${param1+\.}
b=${param2+\*}
a=${param3+test}
find $c -iname $b -exec grep -H $a {} \;

2 ответа2

1

Создайте скрипт оболочки и добавьте его в свой PATH:

#!/bin/bash
find $3 -iname $2 -exec grep -H $1 {} \;

Назовите его mysearch , сделайте его исполняемым chmod +x mysearch , убедитесь, что он работает, и добавьте его в свой путь:

источник

Больше информации о параметрах в bash

Отредактируйте /home/you/.bash_profile и добавьте туда свой скрипт. Это должно работать при mysearch x x x . Возможно, вы захотите сделать значения по умолчанию для каждого параметра. Это довольно просто, вот инструкции для базовых и продвинутых целей.

РЕДАКТИРОВАТЬ: Основы Bash Param:

Параметры в bash имеют вид $1 $2 $3 , где $1 - это первый параметр, который вас волнует. На самом деле это $0 , но это имя вашего скрипта, которое отображается в командной строке при вызове, так что это не так важно.

PARAM1 = $ 1 PARAM2 = $ 2

Вы были довольно близко Вместо c=${param1+\.} Это должно быть: c=${1:-"."} (Я думаю, что вы можете опустить кавычки, но проще сказать, что это за строка, если она у вас есть).

Я также сделал бы ${c} вместо $c потому что иногда вам нужны фигурные скобки, но никогда не будет неправильно размещать их везде.

1

В Linux создайте псевдоним, чтобы найти строку во всех файлах.

  1. Я предполагаю, что вы используете что-то вроде Ubuntu 12.10.
  2. Я предполагаю, что ваше имя пользователя 'el', а ваш домашний каталог - /home/el
  3. Я полагаю, вы хотите запустить команду, как find . -iname $1 -exec grep -H $2 {} \; через псевдоним с замененными параметрами.
  4. Я предполагаю, что вы хотите посмотреть только под текущим каталогом.

Как это сделать:

  1. Создайте файл с именем /home/el/findstring.sh Поместите туда эти команды:

    #!/bin/bash
    if [ "$1" == "all" ]
    then
      echo "command:  find / -exec grep -H $2 {} \; 2>/dev/null"
      find . -exec grep -H "$2" {} \; 2>/dev/null;
    else
      echo "command:  find . -iname $1 -exec grep -H "$2" {} \; 2>/dev/null"
      find . -iname $1 -exec grep -H $2 {} \; 2>/dev/null;
    fi
    
  2. Сохраните его и откройте файл /home/el/.bashrc . Добавьте эту команду:

    alias fin="/home/el/bin/findstring.sh"
    
  3. Сохраните его и убедитесь, что findstring.sh имеет права на выполнение:

    chmod +x /home/el/bin/findstring.sh
    
  4. Получите ваш /home/el/.bashrc как этот (или просто перезапустите терминал)

    source /home/el/.bashrc
    
  5. Создайте тестовый файл с именем "foobar" с текстом "moobar".

  6. Попробуй это. cd / и введите эту команду в терминал:

    fin foobar moobar
    
  7. Вы должны получить этот вывод:

    el@apollo:/$ fin foobar moobar
    command:  find . -iname foobar -exec grep -H moobar {} \; 2>/dev/null
    /home/el/foobar:moobar
    find: `/run/wpa_supplicant': Permission denied
    find: `/run/cups/certs': Permission denied
    
  8. Хорошо, так это сработало, и вы сделали. Однако это также говорит нам, что у нас нет прав на поиск в определенных каталогах или файлах.

Что если вы хотите, чтобы ваш пользователь мог искать ЛЮБОЙ файл в системе независимо от владельца?

Вы, вероятно, выполнили приведенную выше команду как пользователь без полномочий root. Множество файлов, которые вы не можете искать, если вы не являетесь пользователем root в целях безопасности. Если вы хотите, чтобы пользователь без полномочий root мог просматривать любой файл независимо от разрешения, выполните следующие действия. (Это нарушение безопасности по строгим стандартам).

  1. Создайте запись в вашем файле sudoers.

    su root
    visudo
    
  2. Добавить эту запись:

    el ALL = NOPASSWD: /usr/bin/find
    
  3. Отредактируйте /home/el/bin/findstring.sh и добавьте слово 'sudo' перед командой поиска следующим образом:

    #!/bin/bash
    if [ "$1" == "all" ]
    then
      echo "command:  find / -exec grep -H $2 {} \; 2>/dev/null"
      sudo find . -exec grep -H "$2" {} \; 2>/dev/null;
    else
      echo "command:  find . -iname $1 -exec grep -H "$2" {} \; 2>/dev/null"
      sudo find . -iname $1 -exec grep -H $2 {} \; 2>/dev/null;
    fi
    
  4. Перезапустите терминал и попробуйте снова:

    el@apollo:/$ fin foobar moobar
    command:  find . -iname foobar -exec grep -H moobar {} \; 2>/dev/null
    /home/el/foobar:moobar
    
  5. Оно работает! Вам не нужно вводить пароль для просмотра внутри корневых файлов, и программа искала файлы с именем foobar с текстом "moobar". Один был найден и возвращен.

Проведите тестирование в реальном мире:

  1. Создайте каталог где-нибудь в файловой системе, назовите его cats.txt, поместите в него строку "allyourbasearebelongtousnow".

  2. Запустите команду:

    el@apollo:/$ fin *.txt allyourbase
    command:  find . -iname *.txt -exec grep -H allyourbase {} \; 2>/dev/null
    ./home/el/cats.txt:allyourbasearebelongtousnow
    
  3. Найдите в каждом файле в файловой системе что-то с allyourbase.

    el@apollo:/home/el$ cd /
    el@apollo:/$ fin all allyourbase
    command:  find . -iname cats -exec grep -H allyourbase {} \;
    /home/el/cats.txt:allyourbasearebelongtousnow
    

    Так что вы не можете передать голую звездочку в мою команду fin . Причина в том, что звездочка является зарезервированным символом на терминале, означающим "заменить все каталоги и файлы в правильном каталоге здесь". Поэтому я отложил слово "все" в качестве замены звездочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .