Bash递归循环搜索文件
我们的赋值只是一个条件语句,表示当前目录中是否存在文件。我已经完成了主要目标,但我只是想弄清楚如何使用循环递归并找到文件名的任何其他匹配项 目前,在第一个目录中找到文件后,我得到一个无限循环。 文件存在并位于/home/charlie/File.txt 文件存在并位于/home/charlie/File.txt **问题:Bash递归循环搜索文件,bash,unix,recursion,directory,find,Bash,Unix,Recursion,Directory,Find,我们的赋值只是一个条件语句,表示当前目录中是否存在文件。我已经完成了主要目标,但我只是想弄清楚如何使用循环递归并找到文件名的任何其他匹配项 目前,在第一个目录中找到文件后,我得到一个无限循环。 文件存在并位于/home/charlie/File.txt 文件存在并位于/home/charlie/File.txt **问题: 即使递归调用函数,我是否需要在某个地方有一个嵌套的for循环 当我试图进入目录时,使用$pwd会把事情搞砸吗 为什么现在打印两次** #!/bin/bash if [
if [[ $# -eq 0 ]] ; then
echo 'Usage: findFile_new.sh [file name]'
exit 0
fi
exist="File exists and is located at "
function check() {
for file in $(pwd)/*
do
if [ -d "$file" ]; then
check $file $1
else
## Look for file
if [ -f "$1" ]; then
echo $exist$(pwd)/$1
fi
fi
done
}
check $1
#!/bin/bash
if [[ $# -eq 0 ]] ; then
echo 'Usage: findFile_new.sh [file name]'
exit 0
fi
exist="File exists and is located at "
echo $1 $2
function check() {
for file in $1/*
do
if [ -d "$file" ]; then
check $file $2
else
## Look for file
if [ -f "$2" ]; then
echo $exist$file
fi
fi
done
}
check $1 $2
您的搜索不是真正的递归搜索,最终将陷入无限循环。 滚动您自己的Bash脚本,该脚本将覆盖目录中递归搜索的所有情况,这可能很棘手(权限处理和链接会浮现在脑海中…) 您可以做的是使用
查找
,它处理所有递归问题,然后提取您可能需要的数据。脚本(实际上是单个命令)将是find-iname$1
查找
(在此目录中)-iname
匹配此名称并忽略大小写和$1
第一个参数值。
从上面您可以grep
提取您可能需要的任何数据
我知道这并没有回答您的问题1:1,但如果您刚刚开始使用Bash,我会说您最好先使用Bash中提供的工具,然后尝试自己的工具。
由于您的任务已经完成,而且这更像是一个一般性的问题,我想我应该向您提供“我将做什么”。)
另一点-当使用$pwd
时-这是一个bash保留的环境变量,最好使用$pwd。这使得理解哪些环境变量是用户声明的,哪些是系统保留的变得简单
编辑:
如果你想看一个很好的例子来说明如何做到这一点,请结帐是的,你就快到了。一个可能的问题是变量$file
将包含文件的路径名,例如path/to/the/testFile.txt
while
变量$2
只能包含testFile.txt
请您尝试以下方法:
#!/bin/bash
# usage: check path targetname
check() {
local file
for file in "$1"/*; do
if [[ -d $file ]]; then
check "$file" "$2"
elif [[ -f $file && ${file##*/} = $2 ]]; then
echo "found: $file"
fi
done
}
if (( $# != 2 )); then
echo "usage: $0 path name"
exit 0
fi
check "$1" "$2"
表达式${file###*/}
删除最右边斜杠前面的路径名
包括在内,现在您可以将其与试图在心理上解决此问题的$2
进行比较。我想可能有一个问题,我如何调用我的检查功能?和它有关吗?当我调用它时,没有得到子目录?