Найдите файл и откройте его для редактирования. Как сделать это быстро в оболочке bash? - PullRequest
2 голосов
/ 22 сентября 2010

Мне много раз приходилось сталкиваться с этой простой и повторяющейся задачей по настройке LAMP или чего-то другого в Ubuntu или Drupal:

Мне нужно отредактировать файл конфигурации (php.ini, httpd.conf, ... как угодно)очень часто, если я не помню путь наизусть, я запускаю эти 2 команды:

locate php.ini
------- typing manually one of the paths that are shown in the list...
nano /etc/php5/apache2/php.ini

Я уверен, что это можно улучшить (без необходимости запоминать пути). Есть ли лучший подход?

Мне нравится, как это было решено с помощью команды history: вы можете выполнить одну из предыдущих команд в истории с помощью !32 (например,).Есть ли аналогичный способ с командами locate или find?

Ответы [ 6 ]

10 голосов
/ 22 сентября 2010

Это не сработает, если в именах файлов или каталогов есть пробелы, но не составит труда создать версию, которая будет.

choose () {
    local PS3="Choose a file to edit: "
    select opt in $(locate "$1") quit
    do
        if [[ $opt = "quit" ]]
        then
            break
        fi
        ${EDITOR:-nano} "$opt"
    done
}

Демо-версия:

$ choose php.ini
 1) /etc/php5/apache2/php.ini
 2) /etc/php5/apache2/php.ini.ucf-old
 3) /etc/php5/apache2/php.ini~
 4) /etc/php5/cli/php.ini
 5) /etc/php5/cli/php.ini~
 6) /home/dennis/Downloads/php.ini
 7) /usr/share/doc/php5-common/examples/php.ini-dist
 8) /usr/share/doc/php5-common/examples/php.ini-paranoid
 9) /usr/share/doc/php5-common/examples/php.ini-recommended
10) /usr/share/php5/php.ini-dist
11) /usr/share/php5/php.ini-dist.cli
12) quit
Choose a file to edit: 12
1 голос
/ 04 апреля 2012

Мне понравился подход из первого ответа, но для моих целей я хотел сделать мягкое сопоставление текущего дерева каталогов, поэтому я изменил его следующим образом:

choose () {
PS3="Choose a file to edit: "
select opt in $(find . -name \*$1\*) quit
do
    if [[ $opt = "quit" ]]
    then
        break
    fi
    nano "$opt"
    done
}
1 голос
/ 22 сентября 2010

Несколько способов сделать это:

  1. Для редактирования первого соответствующего файла:

    nano `locate -l1 php.ini`
  2. Для поиска в истории последних команд нажмите CTRL + R несколько раз.

  3. В zsh вы можете сделать (обычно медленнее, чем locate):

    nano /etc/**/php.ini

Совет: используйте псевдонимы или функции оболочки для часто используемых команд.

1 голос
/ 22 сентября 2010

если у вас есть только один результат:

nano `locate php.ini`

, если вы хотите редактировать последние

nano `locate php.ini|tail -n 1`

, если вы хотите искать только в каталоге:

nano `find /path/where/the/directory/is -type f -name php.ini`

и т.д.

1 голос
/ 22 сентября 2010

Основная проблема заключается в том, что вам нужно указать способ выбрать один из путей, который находит находки.Сейчас вы делаете это вручную, но для его автоматизации вам нужно указать, как сделать этот выбор.

Например, если вы просто хотите использовать какой-либо старый путь, выберите первый:

nano `locate php.ini | head -n 1`

Чтобы выбрать результат из середины, используйте как голову, так и хвост, например, 11-е:

nano `locate php.ini | head -n 11 | tail -n 1

В общем случае измените аргумент head на номер строки, которую вы хотите редактировать.Возможно, вы захотите попробовать и другие способы, если вы знаете уникальную часть пути, скажем, blah - это часть пути, который вы хотите, но не в любом другом, например, /opt/bin/blah/php.ini.,Тогда вы можете вместо этого использовать grep:

nano `locate php.ini | grep blah'

Редактировать:

Хотя все эти советы делают то, что вы хотите, я просто перечитал ваш вопрос и понял, что есть гораздо лучший способ.Сделайте то, что вы делаете сейчас - вручную запустите locate, затем введите nano /some/path/php.ini.

Каждый раз после этого просто введите ctrl-r, затем php.ini, и bash найдет эту команду в вашей истории дляВы так, что вам не придется вводить его снова.

0 голосов
/ 22 июля 2017

Просто используйте эту команду:

locate filename | xargs xdg-open
...