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 nullglob
和 failglob
可以控制此行为)
模式不匹配文件的原因是因为其中没有目录分隔符。你要
echo */*Final*tif
或
find . -name '*Final*tif' -ls
您还必须指定目录,如下所示:
ls */*Final*tif
不幸的是,ls -R
不能以特别有用的方式使用通配符,因此对于有多个目录级别的情况,您可以使用 find
,如下所示:
find . -name '*Final*tif'
我觉得奇怪的是,当我使用 *
通配符时,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 nullglob
和 failglob
可以控制此行为)
模式不匹配文件的原因是因为其中没有目录分隔符。你要
echo */*Final*tif
或
find . -name '*Final*tif' -ls
您还必须指定目录,如下所示:
ls */*Final*tif
不幸的是,ls -R
不能以特别有用的方式使用通配符,因此对于有多个目录级别的情况,您可以使用 find
,如下所示:
find . -name '*Final*tif'