簡體   English   中英

find 命令不能排除確切的正則表達式

[英]find command can't exclude the exact regex

我有以下腳本:

#!/bin/bash
arg=$1
exclude='(/etc/alternatives/(awk|vim)|/usr/sbin/poweroff)$'
find $arg -type f,l,c,b -regextype posix-extended -not -regex "${exclude}" -print

我沒有在每個文件的開頭使用^所以它可以用任何東西開始。 但是我在每個文件的末尾都使用了$

因此,當我以這種方式運行腳本時,它可以正常工作:

$ sudo bash script.sh /etc/ | grep awk
/etc/alternatives/nawk
/etc/alternatives/nawk.1.gz
/etc/alternatives/awk.1.gz

但是當我這樣做時是錯誤的:

$ sudo cp -rv /etc/ /tmp/
$ sudo bash script.sh /tmp/etc/ | grep awk
/tmp/etc/alternatives/awk
/tmp/etc/alternatives/nawk
/tmp/etc/alternatives/nawk.1.gz
/tmp/etc/alternatives/awk.1.gz

在這里,您會看到文件/tmp/etc/alternatives/awk由於缺少^符號而不應在結果中傳遞。

更新

這種模式很好用,但我想使用上面的一種:

find $arg -type f,l,c,b | grep -Ev "${exclude}"

據我所知, -regex測試是一個特定於 GNU 的find實現的特性; 它不是由 POSIX 定義的。 無論如何,幾乎可以肯定,GNU 的實現是您最喜歡的 Linux 發行版上的實現。 它的手冊是這樣說的:

測試:-regex expr
測試:-iregex expr
如果整個文件名與正則表達式 expr 匹配,則為真。 這是對整個路徑的匹配,而不是搜索 [...]

(強調)。 也就是說,測試總是像正則表達式被錨定到行的開始結束一樣執行,即使模式中沒有明確的錨點。 您可以通過為正則表達式添加前綴和/或后綴.* ,視情況而定。

對於您的示例,這可能如下所示:

exclude='.*(/etc/alternatives/(awk|vim)|/usr/sbin/poweroff)'

我省略了不需要的尾隨錨點,因為這對我來說似乎更清楚,但是如果您更願意保留它,那么就這樣做 - 它沒有害處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM