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

如何将find的结果传递到Bash中的函数中?,bash,Bash,因此,我的脚本中有一个find语句,如下所示: find $path -type f -printf '%s %p\n' | sort -nr | head -15 但是,我不想打印15行中每一行的大小和名称,而是想将它们传递到一个函数中。我已经浪费了很多时间在读代码时尝试;执行,但这似乎不适用于排序和查找功能 您可以像Bash中的命令一样使用函数,并且可以在管道中使用它们: #!/bin/bash sort_head() { sort -nr | head "-${1}" } f

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

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

但是,我不想打印15行中每一行的大小和名称,而是想将它们传递到一个函数中。我已经浪费了很多时间在读代码时尝试
;执行
,但这似乎不适用于
排序
查找
功能

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

#!/bin/bash

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

find $path -type f -printf '%s %p\n' | sort_head 15
它们还以另一种方式起着命令的作用。函数始终返回一个整数,表示成功或错误代码。返回
0
的函数表示成功,任何非零返回都被视为错误。这可以在调用函数后通过
echo$?
看到


在管道中传递函数时,它只是将上一个命令的标准输出重定向到该函数。所以你们仍然可以在读行的时候做一个
;如果需要,请在函数内部执行
循环。在我上面的例子中,
find
的输出仍然像以前一样传递到
sort
,并且输出到您的控制台。

您可以这样做

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

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

好的,很酷。假设sort_head函数以大小和名称作为参数,我会怎么做呢。是否会发现$path-type f-printf“%s%p\n”| sort_head“%s%p”有效?或者我必须修改sort_head函数以将$line作为参数?我添加了一个如何将参数传递给函数的示例。您可以使用
$1
作为第一个参数,使用
$2
作为第二个参数,等等。我还添加了一些关于如何工作的注释。您不能仅仅将文件名传递给管道中的函数,因为从技术上讲,您是“在一个流中一次性传递整个输入”。但是您可以在读取时使用
循环读取它,然后为每个循环调用函数,或者如果您确实需要逐行操作,也可以在上面的函数中使用循环。这些行来自标准输入。所以你仍然必须在读行的时候
;做完成
以实际获取
$line
。我尝试了“While read line”一段时间,但它似乎弄乱了head and sort函数,因为被调用函数的输出没有排序,或者没有最大的文件,所以我将尝试在函数中的循环中调用它。