如何在 grep 中引入条件 OR ?例如,查找文件类型(JPEG 或 JPG),然后仅将这些文件发送到照片文件夹中。例如。我知道如何将文件发送到我想要的位置,并获取文件类型,我只需要 grep 部分的一些帮助。
我使用的是 OS X,IMO 似乎比我在 *nix 环境中习惯的实用程序修改/定制了 *nix 实用程序。所以希望答案能够尽可能通用/可移植。
答案1
您可以多次grep
使用该选项来传递多个正则表达式:-e
grep -e正则表达式1-e正则表达式2 输入文件
将匹配行匹配regex1
或者regex2
。
答案2
这是另一种方法:
grep "foo\|bar" /path/to/file
这可以找到文本foo
或bar
在file
答案3
我对正则表达式也相当陌生,但由于没有其他人回答,所以我会尝试一下。管道运算符“|”用于 OR 运算符。
下面的正则表达式应该可以带你去某个地方。
.+((JPG)$|(JPEG)$)
(匹配任何内容一次或多次,最后加上“JPG”或“JPEG”)
扩展答案(在了解了一些 (e)grep 后编辑):假设您有一个文件夹,其中包含以下文件:
test.jpeg, test.JpEg, test.JPEG, test.jpg, test.JPG, test.notimagefile, test.gif
(名字没那么有创意...)
首先,我们首先定义我们对模式的了解:我们知道我们正在寻找名称的结尾。因此,我们使用“$”操作数来定义每一行必须以定义的模式结束。我们知道图案必须是 JPEG 或 JPG。为此,我们使用管道“|”作为或操作数。我们现在的模式是:
((JPEG)|(JPG))$
(匹配以“JPEG”或“JPG”结尾的任何行)
然而我们看到,在这个例子中,唯一的区别是可选的“E”。为此,我们可以使用“?”操作数(表示可选)。我们写:
(JP(E)?G)$
(Mach 任何以以下模式结尾的文件:“J”,后跟“P”,后跟可选的“E”,后跟“G”)。
然而,我们可能还想匹配文件名中带有小写字母的文件。为此,我们引入字符类“[...]”。含义与以下任一内容匹配。我们写:
([jJ][pP]([eE])?[gG])$
(匹配以 at 模式结尾的任何文件,例如:“j”或“J”,后跟“p”或“P”,后跟可选的“e”或“E”,后跟“g”或“G”) (这也可以使用 grep 中的“-i”选项来完成,但我将其作为 REGEX 中的练习)
最后,由于我们(希望)开始看到一种模式,因此我们可以省略不必要的括号。由于只有一个可选字母(“E”),因此我们可以省略这一字母。另外,由于文件仅以这种模式结束,因此我们可以省略起始和结束括号。因此我们简单地得到:
[jJ][pP][eE]?[gG]$
最后;假设您还想查找“.gif”文件类型的文件,我们可以将其添加为第二个参数:
([jJ][pP][eE]?[gG])|([gG][iI][fF])$
(这里我再次添加了额外的括号以提高可读性/分组。如果它们看起来令人困惑,请随意删除它们。)
最后,我使用 ls 和管道将所有文件名发送到 (e)grep:
ls | egrep '([jJ][pP][eE]?[gG])|([gG][iI][fF])$'
结果:
test.gif
test.JPG
test.JpEg
test.JPEG
test.jpg
test.JPG
第二次编辑:使用 -i 选项并省略括号,我们可以将其缩短为仅:
ls | egrep -i 'jpe?g|gif$'
答案4
file $file
您是否通过运行并查看输出来获取文件类型?
tk-mbp:~ tkennedy$ file share/rally.jpg
share/rally.jpg: JPEG image data, JFIF standard 1.01
或者,您只是查看文件扩展名?
如果您要从 file 命令的输出中查看实际的文件类型:
for file in $(find $dir -type f -exec file {} \; | grep JPEG | cut -d: -f1); do mv $file $photo_dir/ ; done
如果您只是查看文件扩展名,则可以在以下位置完成所有操作find
:
find $dir -type f -name \*jpg -o -name \*jpeg -o -name \*JPG -o -name \*JPEG -exec mv {} $photo_dir/ \;
如果您只想知道如何将多个参数传递给 grep,可以在Mac OS X 上使用egrep
或来完成此操作。grep -E
find $dir | grep -E 'jpg|jpeg|JPG|JPEG'
ETC。