找到一个文件并打开它进行编辑。如何在bash shell中快速完成?

时间:2010-09-22 12:41:40

标签: linux bash drupal shell lamp

我多次面对这个简单而重复的任务配置LAMP或Ubuntu或Drupal中的一些东西:

我必须经常编辑一个配置文件(php.ini,httpd.conf,......等等),如果我不记得路径,我会运行这两个命令:

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

我确信这可以改进(无需记住路径)。 有更好的方法吗?

我喜欢使用命令history解决这个问题的方式:您可以使用!32执行历史记录中的一个先前命令(例如)。与locatefind命令有类似的方法吗?

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

基本问题是您需要指定一种方法来选择找到找到的路径之一。您现在手动执行此操作,但要自动执行此操作,您需要指定如何进行该选择。

例如,如果您只想要任何旧路径,那么请选择第一个路径:

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会在您的历史记录中找到该命令,以便您不必再次输入。

答案 2 :(得分:1)

如果您只有一个结果:

nano `locate php.ini`

如果你想编辑最后一个

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

如果您只想在目录中搜索:

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

答案 3 :(得分:1)

有几种方法:

  1. 编辑第一个匹配的文件:

    nano `locate -l1 php.ini`
  2. 要在历史记录中搜索最近的命令,请反复按CTRL + R.

  3. 在zsh中你可以做(​​通常比定位慢):

    nano /etc/**/php.ini
  4. 提示:对常用命令使用别名或shell函数。

答案 4 :(得分: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
}

答案 5 :(得分:0)

只需使用此命令:

locate filename | xargs xdg-open