我正在构建一个小的 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 <out.txt
最好我想让它只转储当前正在查看的应用程序的 javap 输出。由于这些 .class 文件可能位于任意数量的子目录中,我不确定如何将它们全部转储到顶级文件夹中,而不在每个应用程序的顶级目录中执行修改后的 Auto.sh。
最佳答案
好的,所以要修复多个查找:
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 <DirectoryList.txt
调用此 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 <ProjectOutputs.txt
再次感谢大家的帮助!
关于linux - Bash grep 命令查找同一个文件 5 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167512/