Псевдоним для поиска файлов по имени и открытия их в VIM

У меня уже есть псевдоним для (более) быстрого поиска файлов:

alias f='find . -iname'

Я использую его так:

$ f *statis*
./main/statistics.py
./test/test_statistics.py

Теперь я хотел бы иметь другой псевдоним, который выполняет тот же поиск, но вместо распечатки найденных файлов открывает их в vim. В идеале это будет работать, когда будет найдено несколько файлов.

Я попытался (используя «echo» вместо «vim» для целей отладки):

 alias fvi='find . -exec echo {} + -iname'

... но похоже, что -exec отменяет -iname, приходящий впоследствии:

$ fvi *statis*
 ./main/statistics.py ./main/probability.py ./test/test_statistics.py 
 ./test/test_probability.py
1
задан 7 September 2015 в 11:52

3 ответа

Начиная с -exec {} аргументы должны прибыть после -iname (так как find 'выполняет' его аргументы слева направо), Вы не можете сделать то, что Вы хотите использовать псевдоним. Вместо этого позвольте своему псевдониму вызвать сценарий, содержащий, например:

#!/bin/sh
find . -iname "$1" -exec vi {} \;

Обратите внимание, что это вызовет vi однажды для каждого файла найден. Если будет много таких файлов, то Вы будете делать многих :q!или ZZвыйти из них. Если Вы хотите вызвать один экземпляр vi для редактирования всех найденных файлов изменитесь \; к a +:

find . -iname "$1" -exec vi {} +

С другой стороны, Вы могли использовать замену команды для обеспечения аргументов vi:

vi $(find . -iname "$1")   # do not use when file names may contain whitespace

Однако оборотная сторона к этому - то, что это перестанет работать на именах файлов, содержащих пробел.

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

fvi () { find . -iname "$1" -exec vi {} + ; }
6
ответ дан 7 September 2015 в 21:52
  • 1
    @Rafael необходимо включать - uname -r часть (с обратными галочками, как в моем ответе, но который can' t появляются в этом комментарии из-за неверного истолкования синтаксиса) получить корректное имя пакета. Но it' s также возможный, что у Вас просто есть различная проблема. Потребовалось бы намного больше информации для знания. Необходимо запустить собственный вопрос, если исправление пакета называет doesn' t добиваются цели. Также удостоверьтесь, что Ваши источники завершены и актуальны. – Hack-R 12 July 2017 в 06:49

Если Вам действительно нужен псевдоним, чем Вы могли бы использовать этот ответ.


Псевдоним в bash не принимает параметры. Поэтому Вам нужны функция и псевдоним и немного измененный find команда:

  1. Отредактируйте Ваш .bashrc

    nano ~/.bashrc
    

    и добавьте строки ниже в конце файла

    myfvi() {
        find . -type f -iname "$1" -exec vi -o {} +
    }
    alias fvi=myfvi
    
  2. Перезагрузите конфигурацию или выход из системы и перевход в систему

    source ~./bashrc
    
  3. Запустите с

    fvi '*statis*'
    

    Но Вы могли также использовать функцию непосредственно

    myfvi '*statis*'
    

Пример

У меня есть три файла в моей папке

$ ls -laog
total 4288
drwxrwxr-x  2 4329472 Sep  7 11:43 .
drwx------ 67   20480 Sep  7 11:28 ..
-rw-rw-r--  1       0 Sep  7 11:43 bar
-rw-rw-r--  1       4 Sep  7 11:23 foo
-rw-rw-r--  1       4 Sep  7 11:23 foobar

И когда я использую псевдоним

fvi 'foo*'

vi открывается двумя файлами.

enter image description here

1
ответ дан 7 September 2015 в 21:52
  • 1
    Спасибо, работавшее для меня также после долгого времени, ища решение (с небольшой модификацией от способности до способного)! – 2xMax 19 November 2018 в 17:06

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

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

Никакая замена параметра не происходит. Если Вы хотите замену параметра, определяете функцию вместо псевдонима. Это так же, как много нажатий клавиш:

fvi () { find . -iname "$1" -exec vi {} + ; }

Однако, если Вы настаиваете, вот взлом для обращения к параметрам командной строки в расширении псевдонима: захватите их из истории оболочки. В Вашем случае это сделает задание:

alias fvi='find . -iname "$(history|tail -n1|sed -e "s/^.*\sfvi\s*//")" -exec vi {} + #'

вывод подоболочки, выполняющейся history | tail -n1 | sed -e "s/.*\sfvi\s*//", - то, что следует fvi. Это соединено в эти find . -iname HERE -exec vi {} + команда, которая является тем, в чем Вы нуждаетесь.

Кроме... существует то, что странный хеш подписывается в конце определения псевдонима. Я предоставляю читателю право выяснять разум d'ГЄtre для улыбки, которую приносит обнародование настоящего взлома. ;-)

0
ответ дан 7 September 2015 в 21:52
  • 1
    @Ligemer, Если Вы даете ссылку на свой вопрос с фоном на Вашей проблеме, что you' ve попробовал, и информация о системе тогда, я попытаюсь помочь Вам. – Hack-R 12 July 2017 в 06:52

Другие вопросы по тегам:

Похожие вопросы: