我现在让我的脚本工作了,我使用了cdwn,只要当前工作目录中没有文件和只有一个目录,它就是cd。否则它会打破无限循环。我有几个为这个脚本创建的泛型函数,但是会用于其他函数,我使用了几个find命令和一个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中有多少dirs,如果有多于或少于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秒才能关闭十个空目录...主延迟似乎是在开始时。我会在早上检查回复,被这些东西带走,现在早上6点,我就是...感谢帮助。
答案 0 :(得分:2)
首先,获取这样的文件数量:
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
如果您遇到其他问题,请发布。
您也可以使用以下代码立即更改目录:
cd $(ls)
即如果只有一个目录。
至于你为什么陷入无限循环:如果dir中有多个文件,你会继续前进。检查文件数是否为ge 1
并相应中断。因此,请将此行更改为if [[ filesExist -eq 1 ]]; then
至if [[ filesExist -ge 1 ]]; then