linux bash grep,关于linux:bash grep命令查找相同文件5次

我正在构建一个小的bash脚本,以运行在多个目录中找到的另一个bash脚本。这是代码:

cd /home/mainuser/CaseStudies/

grep -R -o --include="Auto.sh" [\w] | wc -l

当我只执行该部分时,它将在每个文件夹中找到5次相同的文件。因此,我没有得到49个结果,而是得到245个。我之前编写了一个递归bash脚本,并将其用作此问题的模板:

grep -R -o --include=*.class [\w] | wc -l

这段代码一直运行完美,没有任何重复。我尝试使用和不使用""运行第一个代码,也尝试使用-r。我已经阅读了bash文档,但似乎找不到防止这种重复的方法,甚至找不到为什么要这样做。关于如何解决这个问题有什么想法吗?

作为一个单独的但相关的问题,是否可以在每个目录中启动Auto.sh以便将Auto.sh的输出转储到该目录中?不必在每个文件夹中放置Auto.sh。这可能比我目前正在执行的工作效率要高得多,也可能会解决我当前的重复问题。

这是Auto.sh的代码:

#!/bin/bash

index=1

cd /home/mainuser/CaseStudies/

grep -R -o --include=*.class [\w] | wc -l

grep -R -o --include=*.class [\w] |awk '{print $3}' > out.txt

while read LINE; do

echo 'Path '$LINE > 'Outputs/ClassOut'$index'.txt'

javap -c $LINE >> 'Outputs/ClassOut'$index'.txt'

index=$((index+1))

done

优选地,我想使其仅转储其当前正在查看的应用程序的javap输出。由于这些.class文件可以位于任意数量的子目录中,因此我不确定如何在不执行每个应用程序顶层目录中经过修改的Auto.sh的情况下将它们全部转储到顶层文件夹中。

尝试引用[\w]模式吗?另外,如果Auto.sh将其输出写入当前目录,则可以,您几乎可以避免使用49个文件副本。只是pushd $dir; abspathtoAuto.sh; popd循环遍历目录。

添加的数量增加到343。这意味着它现在在每个目录中找到两个额外的条目。关于第二个问题,我应该更具体一些。 Auto.sh遍历每个子目录,并对找到的每个.class文件执行javap函数。它当前将所有内容输出到一个文件夹,但是我想按应用程序拆分该输出。因此,我想在应用程序的顶层目录中执行它,并将该应用程序的所有javap信息输出到应用程序顶层目录中的单个文件夹中。我可以发布上面的Auto.sh代码。

-o将打印出每个匹配项,因此您确定该模式不是合法匹配5次吗?如果您只想知道哪些文件匹配,则可以执行-l而不是-o

-l工作了!非常感谢你们!关于我上面的评论中所述如何执行Auto.sh的任何其他建议?我打算将Auto.sh的代码添加到原始问题中。再次感谢。

$LINE的值是Java类的"名称"吗?可以从当前目录中找到该名称到路径的位置吗?您是否希望每次javap运行的输出都转到相对于当前目录及其所运行的类的位置?

是$ LINE是每个.class文件的路径。它遍历上面grep命令的路径。因此,我想将针对当前整个应用程序的javap的每次运行输出到一个文件夹中。这样我就可以在一个文件夹中找到该应用程序的所有javap信息。我在上面用Auto.sh的代码添加了更好的描述。

无需运行grep两次,只需使用wc -l out.txt输出计数即可。

您认为模式[\w]匹配什么?在我阅读时,它与字母w匹配,与使用模式w完全相同。

我认为我可能不小心将其作为Javaism继承了下来。我只是想看看它是否匹配任何东西。我想我应该删除它。

@TheNoviceAllen:由于shell甚至在grep看到它之前就解释了该参数,因此反斜杠将被删除,而grep保留[w]。但是,即使您转义了反斜杠或引用了该参数,grep也不会将\w视为[[:alnum:]],我认为这正是您想要的。对于grep,[\w]是可识别反斜杠或字母w的字符类。

我用\w代替了它,现在它似乎正在寻找包含任何单词的同名文件。

好的,因此要修复多个查找:

grep -R -o --include="Auto.sh" [\w] | wc -l

应该:

grep -R -l --include=Auto.sh '\w' | wc -l

发生这种情况的原因是,它正在Auto.sh中查找字母w的实例。 在文件中发生了5次。

但是,不需要将Auto.sh放在每个目录中的整体修复是这样的:

MAIN_DIR=/home/mainuser/CaseStudies/

cd $MAIN_DIR

ls -d */ > DirectoryList.txt

while read LINE; do

cd $LINE

mkdir ProjectOutputs

bash /home/mainuser/Auto.sh

cd $MAIN_DIR

done

调用此Auto.sh代码:

index=1

grep -R -o --include=*.class '\w' | wc -l

grep -R -o --include=*.class '\w' | awk '{print $3}' > ProjectOutputs.txt

while read LINE; do

echo 'Path '$LINE > 'ProjectOutputs/ClassOut'$index'.txt'

javap -c $LINE >> 'ProjectOutputs/ClassOut'$index'.txt'

index=$((index+1))

done

再次感谢大家的帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值