如何将 find 的结果设置为变量?

如何将 find 的结果设置为变量?

find . | grep "B02_10m.tif$"

在终端中执行此代码片段时,我能够获取以 B02_10m.tif 结尾的所有文件。但是我需要这个列表作为 ac 文件的输入来进行一些处理。输入必须是 Linux 变量才能将其作为脚本参数的一部分进行传递。

./avg outAVG $files 其中 $files 是包含第一个片段结果的变量。

那可能吗?我已经尝试过:

files = $(find . | grep "B02_10m.tif$")

Command 'files' not found, did you mean:

  command 'file2' from deb file-kanji
  command 'file' from deb file

Try: sudo apt install <deb name>

但这没有用。

答案1

假设您使用的是bashshell:

shopt -s globstar nullglob dotglob

./avg outAVG ./**/*B02_10m.tif

这将调用您的avg程序,其中包含当前目录中或当前目录下文件名以B02_10m.tif.它通过首先启用**通配模式来实现这一点shopt -s globstar。该模式“递归地”匹配子目录。如果您的 TIFF 文件位于当前的目录,你不需要**这个模式的部分。

另外两个 shell 选项可确保通配模式与隐藏名称相匹配,并且如果没有匹配,它们将完全扩展为空,只是为了模仿您想要对find.

如果您使用的是zshshell,那么您可以使用

./avg outAVG ./**/*B02_10m.tif(.DN)

这也会做同样的事情。同样,如果您知道存储 TIFF 图像的目录,则不需要**模式位,而是可以插入该目录的正确路径。

在任何sh类似 shell 中,如果您的文件位于名为 的目录中$dir,则可以使用

./avg outAVG "$dir"/*B02_10m.tif

这显然不会对 的子目录进行递归搜索$dir


您的方法不起作用有两个原因:

  1. 变量赋值时存在语法错误files=作业中的周围不能有空格。

  2. 更正该语法错误,您将许多单独的文件名组合成一个字符串。这样做忽略了文件名很可能包含通常用作 shell 通配符的空格和字符的事实。当您稍后使用$files不加引号时,shell 会将字符串拆分为空格字符上的几个单词(默认情况下),然后展开看起来像 shell 通配模式的所有单词。如果您不总是使用非常简单的文件名,这将使您的代码行为不当。

有关这些问题的更多信息,请参见

答案2

files1=`find . | grep "B02_10m.tif$"`

你可以试试这个吗?

相关内容