Использование псевдонима в find -exec
У меня очень длинная команда в bash, которую я не хочу вводить все время, поэтому я помещаю псевдоним в свой .profile
alias foo='...'
Теперь я хочу выполнить этот псевдоним, используя find -exec
find . -exec foo '{}' \;
но find не может найти foo:
find: foo: Нет такого файла или каталога
Можно ли использовать псевдоним в поиске?
Ответы
Ответ 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 {}" \;