Как запустить исполняемую программу с фильтром

Как запустить исполняемую программу с фильтром

Я хочу запустить скрипт оболочки. У этого скрипта длинное имя. Поэтому я хочу использовать фильтр для файла.

бывший:ls | grep myfile | ./

Возможно ли выполнить файл с фильтром.

решение1

Просто введите:

*myfile*

Вы также можете сделать:

"$(ls | grep pattern)"

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

Все эти решения предполагают, что в текущем каталоге есть только один файл, соответствующий шаблону.

решение2

Вы можете использоватьxargsдля такого рода вещей:

ls | grep myfile | xargs sh

xargsсчитывает строки на входе и передает их в качестве аргументов программе, указанной в качестве аргумента: в данном случае он считывает вывод grep, а затем запускает sh long_myfile_name. (Измените shна bash, если ваш скрипт зависит от специфичных для Bash функций или какой-либо другой оболочки)

В этом простом случае вы также можете добиться sh *myfile*того же эффекта — если у вас grepболее сложная ситуация, вы, возможно, не сможете этого сделать, но sh "$(ls | grep ...)"это сработает.


Тем не менее, есть несколько причин, по которым вы можете не захотеть этого делать: в частности, если возможно, что в какой-то момент будет два файла, соответствующих вашему grep. В этот момент произойдет одно из трех: ваш скрипт получит дополнительный аргумент, будут запущены два разных скрипта или вместо них будет запущен другой скрипт. Вы можете, скажем, выполнить pipe into, head -n 1чтобы избежать первых двух, но тогда будет выполнен произвольный скрипт, что не поможет. В этом $()случае он просто потерпит неудачу, что, вероятно, является лучшим из плохих результатов. Если в именах файлов есть пробелы, вам придется быть еще более осторожными.

Дополнение вашей оболочки может быть лучшим вариантом: вы, вероятно, можете написать *myfile*и нажать TAB, чтобы получить либо правильное расширение, либо указание на то, что есть более одной возможности, или даже просто начать писать имя и завершить его нажатием Tab. Если вы запускаете это в скрипте, просто поместите туда полное имя — вам нужно написать его только один раз. Ответ над строкой подойдет, но я не очень рекомендую это делать.

решение3

вы можете использовать xargsнапример

ls | grep myfile | xargs bash

или фильтровать с помощьюfind

find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;

Связанный контент