如何在bash中使用find时调用函数?

时间:2016-02-24 03:52:57

标签: bash find

所以我的目标是打印一个小图,然后是文件大小和15个最大文件的路径。但是,我遇到了试图在每一行上调用create_graph函数的问题。这里有什么不工作

find $path -type f | sort -nr | head -$n | while read line; do
            size=$(stat -c '%s' $line)
            create_graph $largest $size 50
            echo "$size $line"
    done

我的问题是它不是对文件进行排序,而且文件不是n个最大的文件。所以它似乎是我的"而读取线"搞砸了一切。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

第一个命令,

find $path -type f

只打印出文件名。因此它无法按大小对它们进行排序。如果要按大小对它们进行排序,则需要将其打印出来。试试这个:

find $path -type f -exec du -b {} \; | sort -nr | cut -f 2 | head -$n | ...

<强>更新

实际上,只有第一部分似乎可以做任何你想做的事情:

find $path -type f -exec du -b {} \; | sort -nr | head -$n

将打印出一个包含大小和文件名的表,按文件大小排序,并限制为$n行。

当然,我不知道create_graph做了什么。

<强>解释

find $path -type f -exec du -b {} \;

查找${path}或其子目录中的所有文件(不是目录或链接),并在每个文件上执行命令du -b <file>

du -b <file>

将输出文件的大小( d isk u sage)。有关详细信息,请参阅man du

这会产生这样的结果:

8880    ./line_too_long/line.o
4470    ./line_too_long/line.f
934 ./random/rand.f
9080    ./random/rand
23602   ./random/monte
7774    ./random/monte.f90
13610   ./format/form
288 ./format/form.f90
411 ./delme.f90
872 ./delme_mod.mod
9029    ./delme

因此,对于每个文件,它会打印大小(-b为&#39;以字节为单位&#39;)。

然后你可以对它进行数字排序。

$ find . -type f -exec du -b {} \; | sort -nr
23602   ./random/monte
13610   ./format/form
9080    ./random/rand
9029    ./delme
8880    ./line_too_long/line.o
7774    ./random/monte.f90
4470    ./line_too_long/line.f
934 ./random/rand.f
872 ./delme_mod.mod
411 ./delme.f90
288 ./format/form.f90

如果你在第一次之后切断它,说五个条目:

$ find . -type f -exec du -b {} \; | sort -nr | head -5
23602   ./random/monte
13610   ./format/form
9080    ./random/rand
9029    ./delme
8880    ./line_too_long/line.o

有些想法将它重新组合在一起:

find . -type f -exec du -b {} \; | sort -nr | head -$n | while read line; do
    size=$(cut -d ' ' -f 1 <<< $line)
    file=$(cut -d ' ' -f 2 <<< $line)
    create_graph $largest $size 50
    echo $line
done

请注意,我不知道create_graph是什么或$largest包含什么。我直接从你的剧本中解脱出来。