如何在UNIX TRU64环境中对文件中的字符串执行递归目录搜索?

如何在UNIX TRU64环境中对文件中的字符串执行递归目录搜索?,unix,find,grep,xargs,Unix,Find,Grep,Xargs,不幸的是,由于Unix Tru64环境的限制,我无法使用GREP-r开关在多个目录和子目录中的文件中执行字符串搜索 理想情况下,我希望传递两个参数。第一个是我希望搜索开始的目录。第二个文件包含要搜索的所有字符串的列表。此列表将由各种目录路径名组成,并将包括特殊字符: ie: /aaa/bbb/ccc /eee/dddd/GGGGG/ 等等 本练习的目的是识别可能在我的列表中具有特定硬编码路径名的所有shell脚本 我在调查过程中发现了一个可能很接近的示例,但我不确定如何自定义该示例以接受字符串参

不幸的是,由于Unix Tru64环境的限制,我无法使用GREP-r开关在多个目录和子目录中的文件中执行字符串搜索

理想情况下,我希望传递两个参数。第一个是我希望搜索开始的目录。第二个文件包含要搜索的所有字符串的列表。此列表将由各种目录路径名组成,并将包括特殊字符:

ie:
/aaa/bbb/ccc
/eee/dddd/GGGGG/
等等

本练习的目的是识别可能在我的列表中具有特定硬编码路径名的所有shell脚本

我在调查过程中发现了一个可能很接近的示例,但我不确定如何自定义该示例以接受字符串参数文件:

例如:查找etb-exec grep测试{}

其中“etb”是目录,“test”是要搜索的硬编码字符串。

这应该可以:

find dir-type f-exec grep-f-f strings.txt{}

dir
是开始搜索的目录

strings.txt
是要匹配的字符串文件,每行一个

-F
表示将搜索字符串视为文本而不是正则表达式

-f strings.txt
表示使用
strings.txt
中的字符串进行匹配

如果只需要匹配的文件名,可以将
-l
添加到grep开关中

脚注:

有些人更喜欢包含
xargs
的解决方案,例如:

find dir-type f-print0 | xargs-0 grep-f-f strings.txt


在某些情况下,它可能更健壮/更高效。

通过阅读,我认为我们不能使用,并且egrep不可用。 我假设(出于某种原因)系统已损坏,并且转义操作无法按预期工作

在正常情况下,
grep-rf patternfile.txt/some/dir/
是最好的选择

包含要搜索的所有字符串列表的文件

假设:gnu coreutil不可用。grep-r不起作用。特殊字符的处理被破坏

现在,你有工作经验了?不这让生活变得容易多了。但让我们为安全着想

假设:工作
sed
od
hextump
xxd
(来自vim软件包)中的一个可用

让我们将其称为patternfile.txt


1.将列表转换为grep喜欢的regexp patternfile.txt包含的示例

/福/

/酒吧/能源部/

/根/

(示例不打印特殊字符,但它就在那里。)我们必须将其转换为

(/foo/|/bar/doe/|/root/)

假设
echo-en
命令未中断,并且
xxd
od
hextump
可用

使用hextump

cat patternfile.txt | hextump-ve'1/1“%02x\n”| tr-d'\n'

使用od

cat patternfile.txt | od-A none-t x1 | tr-d'\n'

并将其导入(HEXTDUMP和od通用)
| sed's:[]*0a[]*$::g'| sed's:0a:\\\\\\:g'| sed's:^[]*:g'| sed's:^::g'| sed's:\\\x:g'
然后将结果导入
\sed's:^:\\(:g'\sed's:$:\\):g'
您有一个转义的regexp模式


2.将转义模式馈送到断开的regexp中 假设有最小空壳逸出量, 我们使用
grep“$(echo-en“转义模式”)”
来完成我们的工作


3.总而言之 构建转义的regexp模式(以hexdump为例)

grep“$(echo-en“$(cat patternfile.txt | hextump-ve'1/1”%02x\n“| tr-d'\n'\sed's:[]*0a[]*$::g'\124; sed's:0a:\\\\\\\\\\\\\\\\\\\:g'\124; sed's:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

将转义所有字符并用(|)括号括起来,以便执行regexp或匹配

4.重新创建目录查找 在正常情况下,即使
grep-r
被破坏,
find/dir/-exec grep{}应该可以工作。
有些人可能更喜欢
xargs
instaed(除非你碰巧有bug的xargs)。 我们更喜欢
find/somedir/-typef-print0 | xargs-0grep-f'patternfile.txt'
方法,但因为 这不可用(无论出于何种正当理由), 我们需要为每个文件执行
grep
,这通常是错误的方式。 但是让我们做吧

假设:
find-type f
有效。 假设:
xargs
已损坏或不可用

首先,如果您有一个有缺陷的管道,它可能无法处理大量文件。 因此,在这样的系统中,我们避免使用
xargs
(我知道,我知道,让我们假装它坏了)

find/whatever/dir/to/start/looking/-type f>要搜索.txt的所有文件的列表

如果您的shell能够很好地处理大型列表,
用于cat-list-of-all-file-to-search-for.txt中的文件;执行grep REGEXP_模式“$file”;
完成是一种很好的方式。不幸的是,有些系统不喜欢这样,
在这种情况下,您可能需要
cat list-of-all-file-to-search-for.txt | split-help-a 4-d-l 2000文件较小的块。部分。
把它变成小块。现在这是一个严重破坏的系统。 然后一个
用于文件中较小的块中的文件;cat“$file”中的单行do;执行grep REGEXP_模式“$single_line”;完成;完成
应该有用

A
cat filelist.txt |读取文件时;do grep REGEXP_PATTERN$文件;完成
可以用作某些系统上的变通方法

如果我的shell不处理引号呢

您可能需要事先转义文件列表

awk
perl
,无论什么,都可以做得更好,但是因为我们限制自己
sed