我覺得奇怪的是,當我使用*通配符時,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
IE,
for file in `ls [0-9][0-9]/*Final*tif` ; do cp ${file} ../ALL_Final_Loc/ ; done
這也很奇怪,因為我找不到合理的解釋來解釋為什么它應該在這里作業。
uj5u.com熱心網友回復:
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"
uj5u.com熱心網友回復:
對于Filename Expansion,如果沒有與該模式匹配的檔案,則默認行為是該模式作為文字字串保留在命令中。(shell 選項 可以控制這種行為nullglob)failglob
模式不匹配檔案的原因是因為其中沒有目錄分隔符。你要
echo */*Final*tif
要么
find . -name '*Final*tif' -ls
uj5u.com熱心網友回復:
您必須像這樣指定目錄:
ls */*Final*tif
不幸的是,ls -R通配符不能以特別有用的方式使用,因此對于您可以使用多個目錄級別的情況find,如下所示:
find . -name '*Final*tif'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455237.html
上一篇:陣列中的Bash關聯陣列
