Bash 'ls'不接受 * 通配符



我觉得很奇怪,当我使用*通配符时,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从字面上理解*,正确的方法是什么?
A 侧面信息,我能够完成这项任务,但是当我使用它时:

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

即,

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

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

Glob 扩展是由 shell 完成的。当您运行时ls *Final*tifbash 将找到与模式匹配的文件*Final*tif并将其名称粘贴到命令中。由于当前目录中没有具有类似名称的文件,因此扩展失败,ls现在收到一个文字*Final*tif作为参数,该参数显然不存在并产生错误

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

ls -R *Final*tif相同。要查找此类文件,请使用find

find -name "*Final*tif"

对于文件名扩展,如果没有与模式匹配的文件,则默认行为是模式随后作为文本字符串保留在命令中。(外壳选项nullglobfailglob可以控制此行为)

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

echo */*Final*tif

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

您还必须像这样指定目录:ls */*Final*tif

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

相关内容

  • 没有找到相关文章

最新更新