如何设法在目录和子目录中找到程序,然后运行该程序?
例如,
find . -type f -name "abc"
查找所有 abc 可执行文件并且:
find . -type f -name "abc" | RUN "abc" -p (WRONG!!!)
使用一个参数“-p”运行abc程序。
我怎样才能实现它?
答案1
有多种方法,每种方法都更适合特定需求。欢迎来到 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
(或者您最喜欢的 shell):
find . -type f -name 'abc' | xargs -p -I '{}' bash -c "'{}' -p"
此处命令被传递给 bash,但您可以选择使用不同的 shell 来运行它们(当然,如果您已安装它)。只需替换bash
为您选择的sh
、csh
、tcsh
、ksh
、zsh
...
或者使用parallel
:
find . -type f -name 'abc' | parallel --no-notice -I '{}' "'{}' -p"
parallel
通常不会默认安装,但值得使用;可以将其视为增强版xargs
(它被编写为使用相同选项),它具有能够运行其收到的条目的有用功能,而不必始终将它们传递给另一个程序(至少,我无法让 xargs 这样做)。顾名思义,命令默认并行运行,以最大限度地提高 CPU/线程利用率。该--no-notice
选项隐藏了它始终显示的引用,直到使用 运行--bibtex
。
或者和at
:
find . -type f -name 'abc' | xargs -I '{}' echo '{}' -p | at now
at
安排命令在指定时间运行;在此示例中now
用于立即运行命令。
答案2
find . -type f -name "abc" | xargs -I'{}' echo '{}' -p | bash
或者
find . -type f -name "abc" | sed 's/$/ -p/' | bash
这两个命令首先在第一个管道前列出名为“abc”的文件。在第一个和第二个管道之间,这两个命令都-p
在每行后附加参数。最后,在第二个管道之后,这些“abc”命令被发送到 bash 执行。
答案3
我只需运行这个:
find . -type f -iname 'abc' -executable -execdir '{}' -p \;
这将按abc
顺序运行所有可执行文件,-p
每次都带有参数。
细节:
.
在当前文件夹及其子文件夹中搜索-type f
仅限文件-iname abc
文件名限制(大小写)我不敏感)-executable
限制为可执行文件-execdir
...\;
执行命令(执行)对于每个匹配的文件(\;),将工作目录设置为匹配文件夹(目录)'{}'
占位符被匹配的可执行文件替换(例如:“./abc”)-p
赋予可执行文件的参数