所以我的脚本中有一个find语句,如下所示:
find $path -type f -printf '%s %p\n' | sort -nr | head -15
但是,我不想打印15行中每一行的大小和名称,而是将它们传递给函数。我浪费了大量时间尝试while read line; do
,但这似乎不适用于sort
和find
函数。
答案 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