Использование псевдонима в find -exec - PullRequest
17 голосов
/ 05 октября 2011

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

alias foo='...'

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

find . -exec foo '{}' \;

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

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

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

Ответы [ 7 ]

10 голосов
/ 07 октября 2011

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

9 голосов
/ 05 октября 2011

Нет, find ничего не знает о ваших псевдонимах.Псевдонимы не похожи на переменные среды в том смысле, что они не «наследуются» дочерними процессами.

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

1 голос
/ 17 августа 2017

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

, поэтому должно работать следующее:

alias ll="ls -al"
find . -type d | while read folder; do ll $folder; done
0 голосов
/ 02 июня 2015

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

Так что вместо:

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 {}" \;
0 голосов
/ 15 февраля 2012

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

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

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

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

[ roach@sepsis:~ ]$ cat ~/.bashrc | grep fvim                                                                                         
alias fvim='sh ~/findVim.sh'

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

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

0 голосов
/ 05 октября 2011

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

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

ваш случай:

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

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

alias foo='your-very-long-command'
0 голосов
/ 05 октября 2011

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

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

Команда sed удаляет ведущий alias foo=' и заменяет конечный ' на "$@", который будет содержать аргументы, переданные сценарию.

...