Bash

為什麼我不能在路徑中使用 * 觸摸?

  • November 4, 2022

這是的輸出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

由於我們現在有一個與*/creditsglob 匹配的文件,即 file Psy/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

引用自:https://unix.stackexchange.com/questions/723668