2010-09-22 3 views
2

сталкивается много раз это простые и повторяющиеся задач конфигурирования ЛАМПЫ или некоторые вещей в Ubuntu или Drupal:Найдите файл и откройте его для редактирования. Как это сделать быстро в оболочке bash?

я должен отредактировать конфигурационный файл (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 командами?

ответ

10

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

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 
+0

Удивительный кусок искусства. Другие ответы - хорошие советы, но это, безусловно, то, что я искал :) – corbacho

+0

Я вошел в Stack Overflow впервые в возрасте, чтобы поблагодарить вас за этот абсолютный драгоценный камень. Благодаря! Единственные небольшие изменения, которые я мог бы предложить, это сделать его сценарием и добавить разрыв после вызова редактора. – robarson

+0

@robarson: не включая 'break' позволяет функции циклироваться, чтобы пользователь мог редактировать другой файл. Они могут выбрать опцию 'quit', когда они закончены. Что касается создания сценария, это тривиально. Я предпочитаю функции для такого рода вещей, но другие могут предпочесть сценарий. Чтобы сделать это одним, удалите первую и последнюю строки и добавьте '#!/Bin/bash' в первую строку. См. Мои изменения для нескольких других улучшений. –

1

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

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

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

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

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

В целом измените аргумент head на номер строки, которую вы хотите отредактировать. Другие способы, которые вы можете попробовать, - это узнать, что вы знаете уникальную часть пути, скажем, blah является частью пути, который вы хотите, но не в любом другом i.e /opt/bin/blah/php.ini. После этого вы можете можете использовать Grep вместо:

nano `locate php.ini | grep blah' 

Edit:

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

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

+0

Если есть 20 результатов (и я хочу выбрать 11-е .. немного больно еще считать строки). Некоторые советы об этом? – corbacho

+1

Я добавил еще несколько примеров, чтобы помочь. – Amoss

1

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

nano `locate php.ini` 

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

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

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

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

и т.д. ,

+0

, но имейте в виду, что 'locate' использует предварительную базу данных, поэтому новые файлы не будут находиться до следующего' updatedb', но 'find' ищет фактические данные, поэтому он медленнее, но точнее –

+0

Хорошие советы :) Они помогают. Я вижу, что 'find' имеет параметр' -exec'. Может быть полезно автоматизировать больше и не запускать 2 команды каждый раз? – corbacho

+1

Я бы предложил использовать 'xargs' вместо' -exec', это намного лучше. например: 'find. -type f -print0 | xargs -n 20 -0 nano' - это отредактирует файлы в текущем каталоге. 20 файлов за один выстрел и пробелы не имеют значения в имени файла. –

1

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

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

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

  3. В Zsh вы можете сделать (как правило, медленнее, чем найти):

    nano /etc/**/php.ini

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

+0

Может быть, может быть объединен с командами истории? и сделать функцию, которая принимает последнюю команду в истории? '!!', а затем обработать его? поэтому функция может быть «myfunction 3» (выполнить третий результат последней команды) – corbacho

1

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

choose() { 
PS3="Choose a file to edit: " 
select opt in $(find . -name \*$1\*) quit 
do 
    if [[ $opt = "quit" ]] 
    then 
     break 
    fi 
    nano "$opt" 
    done 
} 
0

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

locate filename | xargs xdg-open