Como posso configurar um apelido ou atalho para fazer o comando * nix find?

3

Quando na linha de comando, acho que tenho que digitar esse comando com muita frequência:

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

Adoraria configurar um alias, script ou atalho para facilitar o trabalho. Eu gostaria de fazer algo como:

mysearch query ("*php") (.)

Seria ótimo se o comando pudesse aceitar três argumentos, na ordem inversa:

query string, file name expression, directory

Se os dois segundos argumentos foram omitidos, o padrão seria não ser incluído e o diretório atual.

Finalmente, a cereja no topo do bolo seria que se variáveis adicionais fossem incluídas (4ª, 5ª, 6ª ...) elas seriam injetadas como argumentos adicionais para o comando find (como eu poderia dizer -tipo d) no fim.

Tentativa de código

Eu tentei o exemplo abaixo, mas ainda estou com problemas para definir os valores padrão. O que estou fazendo errado?

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

2 respostas

1

Crie um script de shell e adicione-o ao seu PATH:

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

Nomeie-o como mysearch , torne-o executável chmod +x mysearch , verifique se funciona e adicione-o ao seu caminho:

fonte

Mais informações sobre parâmetros no bash

Edite /home/you/.bash_profile e adicione seu script lá. Deve funcionar quando você digita mysearch x x x . Você pode querer fazer padrões para cada parâmetro. É muito fácil, aqui está um tutorial para básico e advanced usa.

EDITAR: Noções básicas de parametros da Bash:

Os parâmetros no bash estão no formato $1 $2 $3 , em que $1 é o primeiro parâmetro com o qual você se importa. Na verdade, existe um $0 , mas esse é o nome do script que aparece na linha de comando quando você o chama, então não é tão importante.

PARAM1 = $ 1 PARAM2 = $ 2

Você estava bem perto. Em vez de c=${param1+\.} , deve ser: c=${1:-"."} (acho que você pode deixar as aspas, mas é mais fácil dizer o que é uma string se você as tiver).

Eu também faço ${c} em vez de $c porque às vezes você precisa de chaves, mas nunca será errado colocá-las em todos os lugares.

    
por 05.04.2011 / 20:26
1

No Linux, crie um alias para encontrar uma string em todos os arquivos.

  1. Eu suponho que você esteja usando algo como o Ubuntu 12.10.
  2. Presumo que seu nome de usuário seja 'el' e seu diretório inicial é /home/el
  3. Suponho que você queira executar o comando como find . -iname $1 -exec grep -H $2 {} \; por meio de um alias com os parâmetros substituídos.
  4. Eu suponho que você queira apenas procurar no diretório atual.

Como fazer isso:

  1. Crie um arquivo chamado /home/el/findstring.sh Coloque esses comandos lá:

    #!/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. Salve e abra seu arquivo /home/el/.bashrc . Adicione este comando:

    alias fin="/home/el/bin/findstring.sh"
    
  3. Salve e verifique se findstring.sh tem permissões executáveis:

    chmod +x /home/el/bin/findstring.sh
    
  4. Fonte seu /home/el/.bashrc como este (ou apenas reinicie o terminal)

    source /home/el/.bashrc
    
  5. Crie um arquivo de teste chamado "foobar" com o texto "moobar" nele.

  6. Teste. cd / e digite este comando no terminal:

    fin foobar moobar
    
  7. Você deve obter esta saída:

    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. OK, então funcionou e você terminou. No entanto, também está nos dizendo que não temos permissões para pesquisar em determinados diretórios ou arquivos.

E se você quiser que seu usuário possa pesquisar QUALQUER arquivo no sistema, independentemente do proprietário?

Você provavelmente executou o comando acima como um usuário não raiz. Muitos arquivos que você não pode pesquisar se você não for root por motivos de segurança. Se você quiser que um usuário não raiz possa procurar em qualquer arquivo, independentemente da permissão, use estas etapas. (Esta é uma violação de segurança por padrões rigorosos).

  1. Crie uma entrada no seu arquivo sudoers.

    su root
    visudo
    
  2. Adicione esta entrada:

    el ALL = NOPASSWD: /usr/bin/find
    
  3. Edite /home/el/bin/findstring.sh e adicione a palavra 'sudo' antes do comando find assim:

    #!/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. Reinicie o terminal e tente novamente:

    el@apollo:/$ fin foobar moobar
    command:  find . -iname foobar -exec grep -H moobar {} \; 2>/dev/null
    /home/el/foobar:moobar
    
  5. Funciona! Você não precisa digitar uma senha para ver os arquivos dentro da raiz, e o programa procura arquivos chamados foobar com o texto 'moobar' nela. Um foi encontrado e devolvido.

Faça alguns testes do mundo real:

  1. Crie um diretório em algum lugar no sistema de arquivos, chame-o cats.txt, coloque a string "allyourbasearebelongtousnow" dentro dele.

  2. Execute o comando:

    el@apollo:/$ fin *.txt allyourbase
    command:  find . -iname *.txt -exec grep -H allyourbase {} \; 2>/dev/null
    ./home/el/cats.txt:allyourbasearebelongtousnow
    
  3. Pesquise todos os arquivos no sistema de arquivos por algo com 'allyourbase'.

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

    Portanto, você não pode passar um asterisco ao meu comando fin . Razão sendo o asterisco é um símbolo reservado no terminal que significa "substituir todos os diretórios e arquivos no diretório correto aqui". Então, deixo de lado a palavra "all" como substituto do asterisco.

por 17.02.2014 / 22:27