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
假设您使用的是bash
shell:
shopt -s globstar nullglob dotglob
./avg outAVG ./**/*B02_10m.tif
这将调用您的avg
程序,其中包含当前目录中或当前目录下文件名以B02_10m.tif
.它通过首先启用**
通配模式来实现这一点shopt -s globstar
。该模式“递归地”匹配子目录。如果您的 TIFF 文件位于当前的目录,你不需要**
这个模式的部分。
另外两个 shell 选项可确保通配模式与隐藏名称相匹配,并且如果没有匹配,它们将完全扩展为空,只是为了模仿您想要对find
.
如果您使用的是zsh
shell,那么您可以使用
./avg outAVG ./**/*B02_10m.tif(.DN)
这也会做同样的事情。同样,如果您知道存储 TIFF 图像的目录,则不需要**
模式位,而是可以插入该目录的正确路径。
在任何sh
类似 shell 中,如果您的文件位于名为 的目录中$dir
,则可以使用
./avg outAVG "$dir"/*B02_10m.tif
这显然不会对 的子目录进行递归搜索$dir
。
您的方法不起作用有两个原因:
变量赋值时存在语法错误
files
。=
作业中的周围不能有空格。更正该语法错误,您将许多单独的文件名组合成一个字符串。这样做忽略了文件名很可能包含通常用作 shell 通配符的空格和字符的事实。当您稍后使用
$files
不加引号时,shell 会将字符串拆分为空格字符上的几个单词(默认情况下),然后展开看起来像 shell 通配模式的所有单词。如果您不总是使用非常简单的文件名,这将使您的代码行为不当。
有关这些问题的更多信息,请参见
- ”为什么循环查找的输出是不好的做法?
find
“(与使用任何内容打印的文件名相关), - ”为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?“(与引用变量相关),以及
- ”为什么*不*解析`ls`(以及该怎么做)?“(与使用
ls
有关你的评论之一)。
答案2
files1=`find . | grep "B02_10m.tif$"`
你可以试试这个吗?