Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash递归循环搜索文件_Bash_Unix_Recursion_Directory_Find - Fatal编程技术网

Bash递归循环搜索文件

Bash递归循环搜索文件,bash,unix,recursion,directory,find,Bash,Unix,Recursion,Directory,Find,我们的赋值只是一个条件语句,表示当前目录中是否存在文件。我已经完成了主要目标,但我只是想弄清楚如何使用循环递归并找到文件名的任何其他匹配项 目前,在第一个目录中找到文件后,我得到一个无限循环。 文件存在并位于/home/charlie/File.txt 文件存在并位于/home/charlie/File.txt **问题: 即使递归调用函数,我是否需要在某个地方有一个嵌套的for循环 当我试图进入目录时,使用$pwd会把事情搞砸吗 为什么现在打印两次** #!/bin/bash if [

我们的赋值只是一个条件语句,表示当前目录中是否存在文件。我已经完成了主要目标,但我只是想弄清楚如何使用循环递归并找到文件名的任何其他匹配项

目前,在第一个目录中找到文件后,我得到一个无限循环。

文件存在并位于/home/charlie/File.txt

文件存在并位于/home/charlie/File.txt

**问题:

  • 即使递归调用函数,我是否需要在某个地方有一个嵌套的for循环

  • 当我试图进入目录时,使用$pwd会把事情搞砸吗

  • 为什么现在打印两次**

    #!/bin/bash

     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
    
  • 越来越近。。。。 为什么我要把它作为我的输出

    文件存在并位于 /home/charlie/@/*testFile.txt 文件存在并位于 /home/charlie//compareQuiz.sh/testFile.txt 文件存在并位于 /home/charlie//dir1/dir2/dir3/dir4/*testFile.txt 文件存在并位于 /home/charlie//dir1/dir2/file.txt/*testFile.txt 文件存在并位于 /home/charlie//dir1/dir2/testFile.txt/*testFile.txt 文件存在并位于 /home/charlie//findFile_new.sh/*testFile.txt 文件存在并位于 /home/charlie//testFile.txt/*testFile.txt 文件存在并位于 /home/charlie//testscript.sh/*testFile.txt 文件存在并位于 /home/charlie/~/*testFile.txt

       #!/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

    进行比较。我想可能有一个问题,我如何调用我的检查功能?和它有关吗?当我调用它时,没有得到子目录?