Bash 'ls' 不接受*通配符

Bash 'ls' does not accept * wildcard

我觉得奇怪的是,当我使用 * 通配符时,ls 有时会按字面意思使用。这是实际情况:我有以下文件夹结构: 这是 ls

的输出
00  02  04  06  08  10  12  14  16  18  20  22  24  26  28  30  32  34  36  38  40  42  44  46  48  99       Codes                    X12
01  03  05  07  09  11  13  15  17  19  21  23  25  27  29  31  33  35  37  39  41  43  45  47  98  ALL_RAW  Implemented_NN_Model.h5

每个编号的文件夹(00 到 99)都包含以下文件:

00_Binarized_Cutoff_0.99_.tif  00_dot_img_model.png  00_Final_Loc.tif  00_Raw_Prediction.tif  Implemented_NN_Model.h5 

我想从这些文件夹中提取所有 *_Final_Loc.tif 个文件。
因此我尝试了这个: ls -R *Final*tif,还有这个:ls *Final*tif。 在这两种情况下我得到相同的输出:

ls: cannot access '*Final*tif': No such file or directory

我只是想知道为什么 ls 从字面上理解 *,正确的方法是什么?
附带信息,我能够完成此任务,但是当我使用它时:

ls  [0-9][0-9]/*Final*tif

for file in `ls  [0-9][0-9]/*Final*tif` ; do cp ${file} ../ALL_Final_Loc/ ; done

这也很奇怪,因为我没有找到一个合乎逻辑的解释为什么它应该在这里工作。

全局扩展由 shell 完成。当你 运行 ls *Final*tif bash 将找到匹配模式 *Final*tif 的文件并将它们的名称粘贴到命令中。由于当前目录中没有同名的文件,扩展失败并且 ls 现在接收一个文字 *Final*tif 作为参数,这显然不存在并产生错误

ls: cannot access '*Final*tif': No such file or directory

ls -R *Final*tif 相同。要查找这样的文件,请使用 find:

find -name "*Final*tif"

对于 Filename Expansion, if there are no files that match the pattern, the default behaviour is that the pattern then remains in the command as a literal string. (The shell options nullglobfailglob 可以控制此行为)

模式不匹配文件的原因是因为其中没有目录分隔符。你要

echo */*Final*tif

find . -name '*Final*tif' -ls

您还必须指定目录,如下所示: ls */*Final*tif

不幸的是,ls -R 不能以特别有用的方式使用通配符,因此对于有多个目录级别的情况,您可以使用 find,如下所示: find . -name '*Final*tif'