【问题标题】:Operating on multiple results from find command in bash在 bash 中对 find 命令的多个结果进行操作
【发布时间】:2013-11-23 17:10:42
【问题描述】:

您好,我是 linux 新手。我正在尝试使用 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 产生了大量结果,我只是不确定如何处理变量分配和比较。任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: linux bash find


    【解决方案1】:
    find "${DIRECTORY}" -name "${FILENAME}.txt" -print0 | xargs -0 -L 1 grep "${KEYWORD}" | cut -c32-33 | sort -nr | head -n1
    

    我们在DIRECTORY 下找到名为FILENAME.txtFILENAME 是一个bash 变量)的文件名。

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

    然后我们再次使用xargs 将它们全部读入,并将空分隔(-0)值作为参数传递给grep,为每个文件名启动一个grep-L 1 - 让我们成为 POSIX - 此处兼容)。 (我这样做是为了避免grep 打印文件名,这会搞砸cut)。

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

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

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

    【讨论】:

    • 太棒了,我正在扫描手册页以获得正确的标志。提供管道的解释(OP 说他是新人!),你有我真诚的投票:)
    • 这真的很有帮助,谢谢。但是我可能应该提到我需要解析的文件包含在多个目录中。我不知道这是否有意义,但我基本上需要能够按日期搜索,即 /2013.04.07、/2012.* 和 /* 如果它们作为参数传递则需要能够工作
    • 在不需要的时候不要使用xargs。这更短更好:find "$DIRECTORY" -name "$FILENAME.txt" -exec grep "$KEYWORD" {} \;。既然$DIRECTORY 就足够了,为什么还要使用更长的${DIRECTORY} 样式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2015-10-18
    • 2016-03-23
    • 2012-07-15
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多