在shell脚本中发出“find”函数的保存结果

时间:2015-07-30 23:35:39

标签: macos bash shell

我对shell脚本非常陌生,但它在帮助我自动执行OS X中繁琐的任务方面非常出色。

我尝试在新脚本中编写的一个函数需要在给定正则表达式字符串的子目录中找到特定的文件名。虽然我知道该文件存在,但版本(以及文件名本身)正在不断更新。

我的功能目前如下:

fname(){
  $2=$(find ./Folder1 -name "$1*NEW*")
}

我稍后会在我的脚本中调用以下行:

fname Type1 filename1

我希望做的是保存我在变量filename1中寻找的文件名。如果我在终端中运行它,我的find语法似乎是正确的,但是当我运行脚本时出现以下错误:

./myscript.sh: line 13: filename1=./Folder1/Type1-list-NEW.bin: No such file or directory

我不确定为什么find的结果不只是保存到我选择的变量。我会感激任何帮助(无论这个问题可能最终都是微不足道的)。谢谢!

编辑:我在子目录中有一堆文件,但是我设置该文件夹的方式我知道我的“查找”查询将返回正好1个文件名。我只需要特定的文件名来完成各种任务(更新,版本检查等)

2 个答案:

答案 0 :(得分:1)

将输出写入文件的语法是command > filename。所以它应该是:

fname() {
    find ./Folder1 -name "$1*NEW*" > "$2"
}

=用于分配变量,而不是保存文件中的输出。

您确定需要将输出放在文件中吗?为什么不把它放在一个变量中:

fname() {
    find ./Folder1 -name "$1*NEW*"
}

var=$(fname Type1)

如果您真的希望函数将变量名称作为参数,则必须使用eval

fname() {
    eval "$2='$(find ./Folder1 -name "$1*NEW*")'"
}

答案 1 :(得分:1)

好的,所以我读这个,你想获取find的输出并将其保存在$2给出的shell变量中。

你实际上不能使用shell变量来动态声明要重命名的新shell变量的名称,当shell在行的开头看到扩展时,它立即开始将这些单词作为参数处理,而不是作业。

可能有某种方法可以通过declareexport取消此功能,但一般来说,您不希望使用shell变量来保存 n 文件名称,特别是如果你在OS X上,这些文件名可能有空格,你不会像你的查找输出那样保护它。

一般情况下,您在这种情况下执行的操作是find文件列表正在吐出,您可以立即采取行动,使用find -exec或作为find . -print0 | xargs -0的一部分管道