我觉得很奇怪,当我使用*
通配符时,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*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"
对于文件名扩展,如果没有与模式匹配的文件,则默认行为是模式随后作为文本字符串保留在命令中。(外壳选项nullglob
和failglob
可以控制此行为)
模式不匹配任何文件的原因是其中没有目录分隔符。你想要
echo */*Final*tif
或
find . -name '*Final*tif' -ls
您还必须像这样指定目录:ls */*Final*tif
不幸的是,ls -R
不能以特别有用的方式处理通配符,因此对于有多个目录级别的情况,您可以使用find
,如下所示:find . -name '*Final*tif'