Bash:为此bash函数添加线程功能,因此速度更快

时间:2016-01-29 09:26:30

标签: linux multithreading bash shell optimization

我有一个bash函数,我经常使用它以一种很好的格式列出文件和目录。问题是,每次执行该函数时,大约需要2-3秒才能完成数据列表。

当我两次调用find命令时,需要两倍的时间。我想问一下,如何将并行启动find命令作为线程然后获取输出。我认为这将使功能输出加载更快。我错了吗?

脚本:

function lsa
{
 # Function to stat files and folders in current dir
 # Takes first argument as directory to stat
 # If no directory supplied, current dir assumed
 if [ -z "$1" ];then
   DIR="."
 else
   DIR="$1"
 fi

 # print directories first
 printf "*** DIRECTORIES *** \n"
 find "$DIR"  -maxdepth 1 -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
 # print non-directories second
 printf "*** FILES *** \n"

 find "$DIR"  -maxdepth 1 ! -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
 }

请告诉我。谢谢。

更新

进行更改

*** DIRECTORIES *** 
[1] 6882
*** FILES *** 
[2] 6883
[1]-  Done                    find . -maxdepth 1 -type d ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null > dirs
[2]+  Done                    find "$DIR" -maxdepth 1 ! -type d ! -name "." -printf "%M %u %g " -exec du -sh {} \; 2> /dev/null > non-dirs
// And then the files and dirs one after other

不做任何更改

borg@borg-cube:~$lsa
*** DIRECTORIES *** 
// All directories
*** FILES *** 
// All files

1 个答案:

答案 0 :(得分:0)

通过在后台运行两个find命令并将其输出保存到不同的文件,您不能拥有多个线程,而是多个进程。然后wait找到命令完成并连接输出(dirs first)。

这样......

find .  -maxdepth 1 -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null > dirs &
...
find "$DIR"  -maxdepth 1 ! -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null > non-dirs &
...
wait
cat dirs non-dirs
....

**更新**

最后将cat dirs non-dirs替换为:

printf "*** DIRECTORIES *** \n"
cat dirs
printf "*** FILES *** \n"
cat non-dirs