Подтвердить что ты не робот

Использование псевдонима в find -exec

У меня очень длинная команда в bash, которую я не хочу вводить все время, поэтому я помещаю псевдоним в свой .profile

alias foo='...'

Теперь я хочу выполнить этот псевдоним, используя find -exec

find . -exec foo '{}' \;

но find не может найти foo:

find: foo: Нет такого файла или каталога

Можно ли использовать псевдоним в поиске?

4b9b3361

Ответ 1

Нет, найти ничего не знает о ваших псевдонимах. Псевдонимы не похожи на переменные среды, поскольку они не "унаследованы" дочерними процессами.

Вы можете создать оболочку script с теми же командами, установить + x разрешения и иметь ее в своем пути. Это будет работать с поиском.

Ответ 2

find сам ничего не знает о псевдонимах, но ваша оболочка делает. Если вы используете достаточно недавнюю версию bash (я думаю, что 4.0 добавила эту функцию), вы можете использовать find . -exec ${BASH_ALIASES[foo]} {} \; для вставки литерального содержимого псевдонима в этой точке в командной строке.

Ответ 3

Другой способ вызова псевдонима при обработке результатов поиска - использовать что-то вроде этого ответа

так что следующее должно работать:

alias ll="ls -al"
find . -type d | while read folder; do ll $folder; done

Ответ 4

Невозможно (или сложно/подвержено ошибкам) ​​использовать псевдонимы в команде find. Более простой способ добиться желаемого результата - поместить содержимое псевдонима в shellscript и запустить этот shellscript:

alias foo | sed "s/alias foo='//;s/'$/ \"\[email protected]\"/" > /tmp/foo
find -exec bash /tmp/foo {} \;

Команда sed удаляет ведущий alias foo=' и заменяет конечный ' на "[email protected]", который будет содержать аргументы, переданные в script.

Ответ 5

Я использую известный псевдоним ll для этого примера, но вместо этого вы можете использовать свой псевдоним, просто замените ll в следующей строке вашим псевдонимом (foo), и он должен работать:

find . -exec `alias ll | cut -d"'" -f2` {} \;

ваш случай:

find . -exec `alias foo | cut -d"'" -f2` {} \;

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

alias foo='your-very-long-command'

Ответ 6

Я столкнулся с тем же и в значительной степени реализовал решение skjaidev.

Я создал скрипт bash findVim.sh со следующим содержимым:

[ [email protected]:~ ]$ cat findVim.sh                                                                                                        #!/bin/bash                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
find . -iname $1 -exec vim '{}' \;

Затем я добавил псевдоним .bashrc как:

[ [email protected]:~ ]$ cat ~/.bashrc | grep fvim                                                                                         
alias fvim='sh ~/findVim.sh'

Наконец, я перезагрузил .bashrc с исходным кодом ~/.bashrc.

Короче говоря, я могу немного быстрее редактировать произвольные файлы сценариев с помощью: $ fvim foo.groovy

Ответ 7

Вместо этого вы можете использовать переменную.

Итак, вместо:

alias foo="echo test"

использование:

foo="echo test"

затем выполните его либо путем подстановки команды, либо eval, например:

find . -type f -exec sh -c "eval $foo" \;

или

find . -type f -exec sh -c "echo `$foo`" \;

Вот реальный пример, который находит все не-двоичные файлы:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())'
find . -type f -exec bash -c "python -c '$IS_BINARY' {} || echo {}" \;