使用正则表达式查找命令未按预期工作
Find command with regex not working as intended
我正在尝试打印所有文件名中不包含 imdb id 的文件。对于那些不知道的人,这里有一些 id 的例子
tt0111161
tt0068646
tt0071562
tt0468569
tt0050083
tt0108052
tt0167260
tt0110912
tt0060196
tt0120737
为了方便回答这个问题,我创建了 10 个文件,其中 5 个文件的名称中包含这些 ID,其余的则没有。
❯ ls
'random_name1 tt9264728.mp4'
'random_name2 tt0111161.mp4'
'random_name3 tt0071562.mp4'
'random_name4 tt0050083.mp4'
'random_name5 tt0108052.mp4'
'random name6.mp4'
'random name7.mp4'
'random name8.mp4'
'random name9.mp4'
'random name10.mp4'
❯find . -regextype sed -not -regex "tt\d{7}" -type f -print
./random_name4 tt0050083.mp4
./random_name1 tt9264728.mp4
./random name6.mp4
./random name7.mp4
./random_name3 tt0071562.mp4
./random_name2 tt0111161.mp4
./random_name5 tt0108052.mp4
./random name8.mp4
./random name9.mp4
./random name10.mp4
从上面可以看出,find 还打印了名称中包含 id 的那些文件。出于某种我不需要的原因,它还在每个结果前添加了“./”。
预期结果-
random name6.mp4
random name7.mp4
random name8.mp4
random name9.mp4
random name10.mp4
由于您使用的是 POSIX BRE 正则表达式风格,以下将适用于您:
find . -regextype sed -not -regex ".*tt[0-9]\{7\}[^/]*$" -type f -print
注:
- 您需要在 POSIX BRE
中的范围量词中转义 {}
不支持 \d
,您需要 [0-9]
来匹配 POSIX 正则表达式中的数字
- 您需要在
find
正则表达式模式中提供匹配 整个 字符串的模式。
正则表达式匹配
.*
- 任何文本,零个或多个字符
tt
- tt
字符串
[0-9]\{7\}
- 七位数
[^/]*
- /
字符 以外的零个或多个字符
$
- 字符串结尾。
我正在尝试打印所有文件名中不包含 imdb id 的文件。对于那些不知道的人,这里有一些 id 的例子
tt0111161
tt0068646
tt0071562
tt0468569
tt0050083
tt0108052
tt0167260
tt0110912
tt0060196
tt0120737
为了方便回答这个问题,我创建了 10 个文件,其中 5 个文件的名称中包含这些 ID,其余的则没有。
❯ ls
'random_name1 tt9264728.mp4'
'random_name2 tt0111161.mp4'
'random_name3 tt0071562.mp4'
'random_name4 tt0050083.mp4'
'random_name5 tt0108052.mp4'
'random name6.mp4'
'random name7.mp4'
'random name8.mp4'
'random name9.mp4'
'random name10.mp4'
❯find . -regextype sed -not -regex "tt\d{7}" -type f -print
./random_name4 tt0050083.mp4
./random_name1 tt9264728.mp4
./random name6.mp4
./random name7.mp4
./random_name3 tt0071562.mp4
./random_name2 tt0111161.mp4
./random_name5 tt0108052.mp4
./random name8.mp4
./random name9.mp4
./random name10.mp4
从上面可以看出,find 还打印了名称中包含 id 的那些文件。出于某种我不需要的原因,它还在每个结果前添加了“./”。
预期结果-
random name6.mp4
random name7.mp4
random name8.mp4
random name9.mp4
random name10.mp4
由于您使用的是 POSIX BRE 正则表达式风格,以下将适用于您:
find . -regextype sed -not -regex ".*tt[0-9]\{7\}[^/]*$" -type f -print
注:
- 您需要在 POSIX BRE 中的范围量词中转义
\d
,您需要[0-9]
来匹配 POSIX 正则表达式中的数字- 您需要在
find
正则表达式模式中提供匹配 整个 字符串的模式。
{}
不支持 正则表达式匹配
.*
- 任何文本,零个或多个字符tt
-tt
字符串[0-9]\{7\}
- 七位数[^/]*
-/
字符 以外的零个或多个字符
$
- 字符串结尾。