bash - 提高此代码性能的最佳方法是什么

bash - what is the best way to improve the performance of this code

我的脚本现在可以运行了,我使用了 cdwn,只要当前工作目录中没有文件且只有一个目录,它就会进入该目录。否则它会打破无限循环。我有几个为这个脚本创建的通用函数,但将用于其他人,我使用了几个查找命令和一个 egrep。请建议如何提高它的性能,这主要是复习和学习 bash 东西的练习,但我想利用它。

下面的函数用来检测wd中是否存在文件

function checkForFilesInCurrentDir(){
    # check if there are files in the current directory
    doFilesExist=`find . -maxdepth 1 -type f`
    if [ -z "$doFilesExist" ]; then
    #   echo "no files"
        return 0 
    else
    #   echo "some files"
        return 1
    fi
}

以下函数检查 dirs,然后在单独的行上打印字符串,然后使用 egrep 计算出现该模式的行数,有效地计算 wd 中的目录数。

function numOfDirsInWD(){
    # check number of dirs in working directory and return that num
    checkForDirs=`find . -mindepth 1 -maxdepth 1 -type d`
    numOfDirs=$(echo "$checkForDirs" | egrep -c "./")
    return $numOfDirs
}

下面的函数就是脚本本身。它打开一个无限循环,检查文件,如果检测到文件,它就会中断,然后它会检查 wd 中有多少目录,如果目录多于或少于 1,它就会跳出循环。否则它会对唯一目录执行 ls 和 cd。然后在下一个目录上重复。上升

function cdwn (){
    while :
    do
        # check for files
        checkForFilesInCurrentDir
        filesExist="$?"
        if [[ filesExist -eq 1 ]]; then
            echo "files exist"
            break
        fi

        # check that only one dir
        numOfDirsInWD
        numOfDirs="$?"
        if [[ numOfDirs -eq 1 ]]; then
            # cd to it
            echo "only one dir"
            name=`ls`
            cd "$name"
        else
            # break out of the loop
            echo "there is not a sole dir"
            break
        fi
    done
}

在我目前的破电脑上,大约需要 18 秒才能进入大约 10 个空目录...主要延迟似乎是在开始时。我会在早上检查回复,被这些东西冲昏了头脑,现在我在早上 6 点...感谢帮助。

首先像这样获取文件数量:

function numOfDirsInWD(){
    # check number of dirs in working directory and return that num
    checkForDirs=`find . -mindepth 1 -maxdepth 1 -type d`
    return ${checkForDirs[#]}
}

这样会更快更容易。

其次,您忘记了美元符号。用这一行替换你的:

if [[ $numOfDirs -eq 1 ]]; then

Post 如果您遇到更多问题。

您也可以使用此代码立即更改目录:

cd $(ls)

那是如果只有一个目录。

至于为什么会陷入无限循环:如果目录中有多个文件,你会继续。检查文件数是否为 ge 1 并相应地中断。所以改变这一行: if [[ filesExist -eq 1 ]]; thenif [[ filesExist -ge 1 ]]; then