Bash

查找在同一個 CWD 中使用正則表達式,但不是從另一個目錄

  • May 29, 2021

我有一個 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 $directoryis /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 的數字,zshglob 是支持數字匹配範圍的極少數模式匹配 API 之一。

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