1

Как мне найти программу в каталоге и подкаталогах, а затем запустить программы?

Например,

find . -type f -name "abc" 

находит все исполняемые файлы abc и:

find . -type f -name "abc" | RUN "abc" -p (WRONG!!!)

запускает программы abc с одним параметром "-p".

Как мне этого добиться?

3 ответа3

2

Есть несколько способов, каждый из которых ориентирован на конкретную потребность. Добро пожаловать в мир UNIX.

Это запускает команды через nohup:

find . -type f -name 'abc' | xargs -I '{}' nohup '{}' -p

Пояснение:

find . посмотрите в текущем каталоге и его подкаталогах.

-type f искать файл.

-name 'abc' имя файла должно быть точно "abc" (с учетом регистра).

| передать полученный список файлов в другую программу.

xargs отправляет отдельные записи в другую программу.

-I '{}' в следующем выражении замените '{}' записью.

nohup это программа, которую xargs будет вызывать несколько раз, каждый раз передавая один из результатов find в качестве параметра. Эта программа используется для запуска заданий, которые будут выполняться в фоновом режиме и не будут прерываться, если текущий сеанс отключается. Чтобы вы могли проверить результаты, вывод команд, выполненных через nohup , по умолчанию добавляется в файл nohup.out в текущем каталоге.

'{}' это заполнитель и будет заменен результатами find .

-p это будет добавлено в качестве дополнительного параметра.

Пример: допустим, у вас есть один файл с именем "abc" в текущей папке, а другой в подпапке с именем "sub"; команды, которые будут выполнены:

nohup ./abc -p
nohup ./sub/abc -p

Примечание: может быть полезно запустить xargs -p как он будет отображать каждую отдельную команду перед ее выполнением. Отвечая y он действительно запустит его, n пропустит его (find . -type f -name 'abc' | xargs -p -I '{}' nohup '{}' -p).

Или используя sudo:

find . -type f -name 'abc' | xargs -I '{}' sudo -u $USER '{}' -p

sudo выполняет команду и позволяет выбрать пользователя для запуска. В этом примере он использует текущего пользователя, имя которого находится в переменной среды $USER .

Или используя bash (или вашу любимую оболочку):

find . -type f -name 'abc' | xargs -p -I '{}' bash -c "'{}' -p"

Здесь команды передаются в bash, но вы можете запускать их с другой оболочкой (если она у вас установлена, конечно). Просто замените bash на ваш выбор sh , csh , tcsh , ksh , zsh ...

Или используя parallel:

find . -type f -name 'abc' | parallel --no-notice -I '{}' "'{}' -p"

parallel обычно не устанавливается по умолчанию, но ее стоит использовать; Думайте об этом как о расширенном xargs (он написан для работы с теми же опциями), который имеет полезную возможность запуска записей, которые он получает, вместо того, чтобы всегда передавать их в другую программу (по крайней мере, я не смог чтобы получить Xargs, чтобы сделать это). Как следует из его названия, команды по умолчанию выполняются параллельно, что максимизирует использование процессора / потока. Опция --no-notice скрывает цитату всегда diplays пока не работают с --bibtex

Или с по at

find . -type f -name 'abc' | xargs -I '{}' echo '{}' -p | at now

at планирует команду, которая будет запущена в указанное время; в этом примере now используется для немедленного запуска команд.

1
find . -type f -name "abc" | xargs -I'{}' echo '{}' -p  | bash

или же

find . -type f -name "abc" | sed 's/$/ -p/' | bash

Обе команды сначала перечисляют файлы с именем "abc" перед первым каналом. Между первым и вторым каналами обе команды добавляют параметр -p после каждой строки. Наконец, после второго канала эти команды abc отправляются в bash для выполнения.

0

Я бы просто запустить это:

find . -type f -iname 'abc' -executable -execdir '{}' -p \;

Это будет запускать все исполняемые файлы abc последовательно с аргументом -p каждый раз.

Детали:

  • . Поиск в текущей папке и подпапках
  • только для файлов -type f
  • Ограничение -iname abc Имя файла ABC (случай я nsensitive)
  • -executable Ограничить исполняемые файлы
  • -execdir ... \; Выполните команду (exec) для каждого соответствующего файла (\;), с рабочим каталогом, установленным как соответствующая папка файла (dir)
    • '{}' Заполнитель заменен соответствующим исполняемым файлом (например: "./abc")
    • -p Аргумент, данный исполняемому файлу

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .