2013-11-23 101 views
0

嗨,我是一个新手linux用户。我试图在bash中使用find命令来搜索给定的目录,每个目录包含多个具有相同名称但具有不同内容的文件,以在文件中查找最大值。对bash中find命令的多个结果进行操作

起初,我没有服用该目录作为输入,并知道该文件将不低于2个目录深,所以我是用嵌套循环如下:

prev_value=0 
for i in <directory_name> ; do 
    if [ -d "$i" ]; then 
    cd $i 
    for j in "$i"/* ; do 
     if [ -d "$j" ]; then 
     cd $j  
     curr_value=`grep "<keyword>" <filename>.txt | cut -c32-33` #gets value I'm comparing 
     if [ $curr_value -lt $prev_value ]; then 
      curr_value=$prev_value 
      else 
      prev_value=$curr_value 

     fi 
     fi 
    done 
    fi 
done  
echo $prev_value 

显然这不会削减它现在。我查看了find的-exec选项,但是由于find产生了大量的结果,我只是不确定如何处理变量赋值和比较。任何帮助将不胜感激,谢谢。

回答

2
find "${DIRECTORY}" -name "${FILENAME}.txt" -print0 | xargs -0 -L 1 grep "${KEYWORD}" | cut -c32-33 | sort -nr | head -n1 

我们发现,被命名为FILENAME.txtDIRECTORY下存在的文件名(FILENAME是一个bash变量)。

我们将它们全部打印出来,用空值分隔(这可以避免目录或文件名中某些字符出现问题)。

然后我们看他们都在再次使用xargs,并通过空分隔(-0)值作为参数grep,推出一个grep每个文件名(-L 1 - 让我们的是POSIX兼容的在这里)。 (我这样做是为了避免grep打印文件名,这会搞砸cut)。

然后我们sort所有的结果,数字(-n),降序(-r)。

最后,我们将第一行(head -n1)的排序数字 - 这将是最大的。

P.S.如果您有4个CPU内核,则可以尝试将-P 4选项添加到xargs以尝试使grep部分运行得更快。

+1

奇妙的是,我正在扫描手册页以获得正确的标志。提供管道的解释(OP说他是新的!),并且你有我的真诚投票:) – slezica

+0

这真的很有帮助谢谢。但是我可能应该提到我需要解析的文件包含在多个目录中。我不知道这是否有道理,但我基本上需要能够按日期搜索,即/2013.04.07,/2012.*和/ *需要能够工作,如果它们作为参数传递 – user3025408

+1

Don'当你不需要它时使用'xargs'。这个更短更好:'find“$ DIRECTORY”-name“$ FILENAME.txt”-exec grep“$ KEYWORD”{} \;'。当'$ DIRECTORY'足够时,为什么使用'$ {DIRECTORY}'风格更长的时间呢? – janos