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 ]]; then
到 if [[ filesExist -ge 1 ]]; then
我的脚本现在可以运行了,我使用了 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 ]]; then
到 if [[ filesExist -ge 1 ]]; then