我想运行一个 shell 脚本。这个脚本的名字很长。所以我想对文件使用过滤器。
前任:ls | grep myfile | ./
是否可以执行带有过滤器的文件。
答案1
只需输入:
*myfile*
您还可以这样做:
"$(ls | grep pattern)"
如果您完整的正则表达式匹配而不仅仅是文件名通配符。
所有这些解决方案都假设当前目录中只有一个文件与该模式匹配。
答案2
您可以使用xargs
对于这类事情:
ls | grep myfile | xargs sh
xargs
读取其输入上的行并将它们作为参数提供给作为参数给出的程序:在这里,它将读取 grep 的输出,然后运行sh long_myfile_name
。 (如果您的脚本依赖于 Bash 特定功能或其他一些 shell,请更改sh
为)bash
在这个简单的情况下,您也可以运行sh *myfile*
基本相同的效果 - 如果您的grep
情况更复杂,您可能无法做到这一点,但sh "$(ls | grep ...)"
会起作用。
也就是说,有一些原因您可能不想这样做:特别是,如果在某个时候可能有两个文件与您的grep
.此时将发生以下三件事之一:您的脚本获得额外的参数,运行两个不同的脚本,或者运行另一个脚本。例如,您可以通过管道来head -n 1
避免前两个,但随后将执行任意一个,这没有多大帮助。在这种$()
情况下,它只会失败,这可能是一系列糟糕结果中最好的结果。如果文件名中有空格,您就必须更加小心。
shell 的制表符补全可能是一个更好的选择:您可以编写*myfile*
并点击 TAB 来获得正确的扩展或指示存在不止一种可能性,或者甚至只是开始编写名称和制表符补全到最后。如果您在脚本中运行它,只需将全名放在那里 - 您只需编写一次。上面的答案会起作用,但我真的不推荐它。
答案3
你可以使用xargs
例如
ls | grep myfile | xargs bash
或使用过滤器find
find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;