如何将find的结果传递给Bash中的函数?

时间:2016-02-24 07:00:31

标签: bash

所以我的脚本中有一个find语句,如下所示:

find $path -type f -printf '%s %p\n' | sort -nr | head -15

但是,我不想打印15行中每一行的大小和名称,而是将它们传递给函数。我浪费了大量时间尝试while read line; do,但这似乎不适用于sortfind函数。

3 个答案:

答案 0 :(得分:1)

您可以像Bash中的命令一样使用函数,并且可以在管道中使用它们:

#!/bin/bash

sort_head()
{
    sort -nr | head "-${1}"
}

find $path -type f -printf '%s %p\n' | sort_head 15

他们也以另一种方式行事。函数始终返回指示成功的整数或错误代码。返回0的函数表示成功,任何非零返回都被视为错误。调用函数后,可以通过echo $?看到这一点。

当您在管道中传递函数时,它只是将上一个命令的标准输出重定向到该函数。因此,如果需要,您仍然可以在函数内部执行while read line; do循环。在上面的示例中,find的输出仍然像以前一样传递给sort,输出将转到您的控制台。

答案 1 :(得分:0)

你可以这样想吗

tmp=`find $path -type f -printf '%s %p\n' | sort -nr | head -15`
for i in $(seq 15)
do
  line=`echo $tmp| sed -n "$i"p`
done

答案 2 :(得分:0)

Find有一个-exec参数,可以让你在它找到的内容上运行一个函数 对于不同版本的linux,find的语法略有不同。对于我来说,对于我想要查找100万个字符或更多字符的文件并使用ls -l来显示它们的命令看起来像这样。 "{}"由结果替换,";"是终结符。你的发现可能略有不同。

find . -type f -size +10000000c -exec ls -l "{}" ";"

输出如下:

-rwx------ 1 Philip mkpasswd 18902016 Jun  6  2012 ./bin/ffmpeg.exe
-rwx------ 1 Philip mkpasswd 18851840 Jun  6  2012 ./bin/ffplay.exe