Bash
為什麼我不能在路徑中使用 * 觸摸?
這是的輸出
tree
:[xyz@localhost Semester1]$ tree . ├── Eng ├── IT ├── IT_workshop ├── LA ├── OS ├── OS_lab ├── Psy ├── Python └── Python_lab 9 directories, 0 files
我想在每個目錄中使用
touch
.我試過這個命令:
[xyz@localhost Semester1]$ touch */{credits,links,notes}
這是輸出:
touch: cannot touch ‘*/credits’: No such file or directory touch: cannot touch ‘*/links’: No such file or directory touch: cannot touch ‘*/notes’: No such file or directory
為什麼該命令沒有按我的預期工作?
順便說一句,我使用的是 CentOS Linux 7。
問題是
*/
在啟動命令之前,shell 會擴展 glob(這是一個 glob)。大括號擴展發生在 glob 之前。這意味著*/{credits,links,notes}
成為'*/credits' '*/links' '*/notes'
,然後這些 glob 由 shell 擴展,並且由於尚未創建文件,因此將 glob 擴展為它們自己。您可以看到與任何不匹配的任何 glob 相同的行為。例如:
$ echo a*j a*j
當它匹配時:
$ touch abj $ echo a*j abj
回到你的情況,因為文件實際上並不存在,你正在執行的命令變成:
touch '*/credits' '*/links' '*/notes'
如果您創建其中之一,您會看到情況發生了變化:
$ touch Psy/credits $ touch */{credits,links,notes} touch: cannot touch '*/links': No such file or directory touch: cannot touch '*/notes': No such file or directory
由於我們現在有一個與
*/credits
glob 匹配的文件,即 filePsy/credits
,該文件可以正常工作,但另外兩個會出錯。做你正在嘗試的正確方法是這樣的:
for d in */; do touch "$d"/{credits,links,notes}; done
結果是:
$ tree . ├── abj ├── Eng │ ├── credits │ ├── links │ └── notes ├── IT │ ├── credits │ ├── links │ └── notes ├── IT_workshop │ ├── credits │ ├── links │ └── notes ├── LA │ ├── credits │ ├── links │ └── notes ├── OS │ ├── credits │ ├── links │ └── notes ├── OS_lab │ ├── credits │ ├── links │ └── notes ├── Psy │ ├── credits │ ├── links │ └── notes ├── Python │ ├── credits │ ├── links │ └── notes └── Python_lab ├── credits ├── links └── notes