Command-Line

查找:?的含義符號作為名稱參數的值

  • May 27, 2016

的含義是什麼?登錄以下命令?

find /foo/path -name \?

?是 shell 中稱為“路徑名擴展”的機制的一部分。

通俗地說,shell 機制被稱為“globing”。基本的 glob 僅使用三個字元:* ?並且[建構“模式”。

星號*表示:

  • 任意數量的任意字元(任意字元串)。

問號 ( ?) 表示:

  • 任何字元一次

方括號定義了一個字元列表[ ],意思是:

  • 只有列表中的字元才算一次。可能存在否定列表。

這些字元在命令 find 中以類似的方式使用。在 find 中,它們被稱為“模式”。

這意味著有兩個實體使用相同的字元來執行相同的任務(萬用字元)。必須告訴人們忽略這些字元。告訴 shell 避免解釋特殊字元的常用方法是“引用它們”。使用“單引號”、“雙引號”或反斜杠:

'?'
"?"
\?

這就是為什麼find引用“模式”的原因:

find /path/foo -name \?

那條線的意思是:

列出從目錄開始/path/foo名稱只有一個字元寬的所有文件和目錄。

關於 /

注意 ?在 find 的模式擴展中可能匹配一個/.

A patternin find 可以匹配/POSIX 在 find 命令的操作數部分中指定的a :

-path 模式 如果目前路徑名使用模式匹配表示法中描述的模式匹配表示法匹配模式,則主節點應評估為真。用於文件名擴展的模式中的附加規則不適用,因為這是匹配操作,而不是擴展。

同樣:文件名擴展(如在 shell 中)的附加規則不適用,因為這是匹配操作,而不是擴展。

為了證明這是真的:

$ mkdir test; cd test
$ mkdir -p a/b/c/d
$ find a -path 'a?b'
a/b
$ find . -path './a?b?c?d'
./a/b/c/d

當然,-namefind 的選項將匹配文件的基本名稱。根據定義,這不可能有 a /as 不可能匹配/基本名稱中的 a。

?模式匹配中的一個特殊字元,它匹配任何單個字元。

所以該命令意味著查找所有文件和目錄/foo/path及其子目錄,其名稱正好是一個字元長。

\?用於防止您的 shell 執行文件名生成。您可以使用其他引用機制

find /foo/path -name '?'

或者:

find /foo/path -name "?"

請注意,?文件名擴展模式中永遠不會匹配/,並且由於斜杠,在計算文件的basename ()-name時將忽略給定的模式(基本名是路徑名中的最終或唯一文件名。在路徑名上下文中,文件名後面可以跟斜杠):

$ mkdir a b
$ find a/ b/ -name a -o -name b\?
a/

僅輸出a/

唯一的例外是/////未引用的實現上/

$ find / ! -path / -prune -o -name \? -print
/

POSIX 定義對/,/////+的基本名稱有點不清楚)

或在busybox中找到:

$ busybox find a/ b/ -name a -o -name b\?
b/

如果您嘗試/在給定的模式中使用-name,那麼行為會因實現而異。

BSD find 和 heirloom find 將表達式視為假,不輸出任何內容:

$ find /tmp -name /tmp
$ echo "$?"
0

GNU find 給你警告資訊:

$ find /tmp -name /tmp
find: warning: Unix filenames usually don't contain slashes (though pathnames do).
That means that '-name ‘/tmp’' will probably evaluate to false
all the time on this system. You might find the '-wholename' test more useful,
or perhaps '-samefile'. Alternatively, if you are using GNU grep,
you could use 'find ... -print0 | grep -FzZ ‘/tmp’'.

它的返回碼是0。

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