gpt4 book ai didi

arrays - Bash,递归中使用相同的变量

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:19 25 4
gpt4 key购买 nike

我正在为 Uni 解决的一个问题是遍历目录并计算所有文件和目录以及子目录中的文件和目录。我无法使用命令 find、locate、du 或任何递归命令,例如 ls -R。为了解决这个问题,我正在创建自己的递归命令。我遇到了在每个递归中使用相同数组的问题,现在使用类似 java 的递归会为递归中的每个变量分配不同的 id。但是这里使用了相同的变量。我可以从我的输出中看出它是从 super 目录而不是正在使用的当前目录打印目录的地方。使用的层次结构是 here我得到的输出是 here

tgtdir=$1
visfiles=0
hidfiles=0
visdir=0
hiddir=0
function searchDirectory {
curdir=$1

echo "curdir = $curdir"
# Rather than change directory ensure that each recursive call uses the $curdir/NameOfWantedDirectory
noDir=$(ls -l -A $curdir| grep ^d | wc -l) # Work out the number of directories in the current directory
echo "noDir = $noDir"

shopt -s nullglob # Enable nullglob to prevent a null term being added to the array

y=0 # Declares a variable to act as a index value
for i in $( ls -d ${curdir}*/ ${curdir}.*/ ); do # loops through all directories both visible and hidden
if [[ "${i:(-3)}" = "../" ]]; then
echo "Found ../"
continue;
elif [[ "${i:(-2)}" = "./" ]]; then
echo "Found ./"
continue;
else # When position i is ./ or ../ the loop advances otherwise the value is added to directories and y is incremented before the loop advances
echo "Adding $i to directories"
directories[y]="$i"
let "y++"
fi
done # Adds all directories except ./ and ../ to the array directories
shopt -u nullglob #Turn off nullglob to ensure it doesn't later interfere
echo "${directories[@]}"
if [[ "${noDir}" -gt "0" ]]; then
for i in "${directories[@]}"; do
searchDirectory $i
done # Loops through subdirectories to reach the bottom of the hierarchy using recursion
fi

visfiles=$(ls -l $tgtdir | grep -v ^total | grep -v ^d | wc -l)
# Calls the ls -l command which puts each file on a new line, then removes the line which states the total and any lines starting with a 'd' which would be a directory with grep -v,
#finally counts all lines using wc -l
hiddenfiles=$(expr $(ls -l -a $tgtdir | grep -v ^total | grep -v ^d | wc -l) - $visfiles)
# Finds the total number of files including hidden and puts them on a line each (using -l and -a (all)) removes the line stating the total as well as any directoriesand then counts them.
#Then stores the number of hidden files by expressing the complete number of files minus the visible files.
visdir=$(ls -l $tgtdir | grep ^d | wc -l)
# Counts visible directories by using ls -l then filtering it with grep to find all lines starting with a d indicating a directory. Then counts the lines with wc -l.
hiddir=$(expr $(ls -l -a $tgtdir | grep ^d | wc -l) - $visdir)
# Finds hidden directories by expressing total number of directories including hidden - total number of visible directories
#At minimum this will be 2 as it includes the directories . and ..
echo "Increased Values"
}
searchDirectory $tgtdir
echo "Total Files: $visfiles (+$hiddenfiles hidden)"
echo "Directories Found: $visdir (+$hiddir hidden)"
echo "Total files and directories: $total"
exit 0

最佳答案

根据 this ,您应该使用 localdirectories 声明为局部变量。如果省略,变量将是全局的。试一试。

关于arrays - Bash,递归中使用相同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34682491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com