Bash
查找在同一個 CWD 中使用正則表達式,但不是從另一個目錄
我有一個 find 命令,我想從一個任意目錄發出它,用一個
$directory
變數代替.
目前工作目錄的點。這是什麼有用的
- 範例 1
find $directory -maxdepth 1 -type d -name "test*"
這給了我一些結果。
這也有效
- 範例 2
find . -maxdepth 1 -type d -regextype posix-extended -regex "^./[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"
但是,
$directory
它不起作用。請注意,我刪除了./
正則表達式開頭的 。
- 範例 3
find $directory -maxdepth 1 -type d -regextype posix-extended -regex "^[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"
為什麼呢?
謝謝
-regex
(非標準),就像-path
文件完整路徑上的標準匹配一樣。這些路徑以 的內容開頭,$directory
然後是 . 找到的目錄和文件find
。所以 if$directory
is/some/dir
,-regex
將匹配正則表達式/some/dir/file-discovered-by-find
, 並且永遠不會在這裡匹配,因為第一個字元是 a/
,而不是 alnum 。在第一種情況下,您的正則表達式以
^./
(應該是^\./
正.
則表達式運算符,或者正如\./
GNU中^
所暗示的那樣find
)-regex
開頭。$directory``.
您需要與 做類似的事情
$directory
,請記住$directory
(^$*()+[]?.\
…) 中的所有正則表達式運算符都需要轉義。但在這裡你也可以這樣做:find "$directory" -maxdepth 1 -type d -regextype posix-extended \ -regex '.*/[[:alnum:]]+([-_][[:alnum:]]+)*-[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){0,3}'
(我也已替換為
.
,\.
因為我懷疑您想匹配文字.
而不是任何字元,並刪除了?
此處不需要的字元)。也就是說,讓你的模式(這裡保證不包含 a
/
)在任何匹配之後/
(並且直到文件路徑的末尾$
也暗示),而不是在匹配的東西之後$directory
。使用
zsh -o extendglob
,您可以:set -o extendedglob w=[0-9a-zA-Z] d=[0-9] print -rC1 -- $directory/$~w##([-_]$~w##)#-$~d(#c1,3)(.$~d(#c1,3))(#c0,3)(#q/)
與 GNU 相比,它有幾個優點
find
:
- 甚至可以在非 GNU 系統上工作(消除對 GNU 的依賴
find
)- 即使
$directory
以-
- 給你一個排序列表
- in
zsh
,[a-zA-Z0-9]
匹配的內容不是隨機的,並且不會像 in 這樣的語言環境而有所不同,find
並且匹配我想你想要匹配的字元,並且只匹配它們。在find
中,您需要[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
獲得等價物。- 即使
$directory
是指向目錄的符號連結,它也可以工作(儘管您可以為此添加-H
選項find
)。- 即使文件路徑(在這種情況下是 的內容
$directory
)包含在目前語言環境中不形成有效字元的字節序列(find
’s-regex
不能.*
匹配那些.
只匹配有效字元),它也可以工作。- 而不是列印該列表,您可以直接使用它(作為命令的參數,循環它等)
- 您還可以使用諸如
(<0-255>~????*)
匹配從 0 到 255 的不超過 3 位數字的十進制數字或(<0-255>~0?*)
不帶前導 0 的數字,zsh
glob 是支持數字匹配範圍的極少數模式匹配 API 之一。