查找命令在终端中有效,但在 bash 脚本中无效

Find command works in terminal but not in bash script

我写了一个查找命令,它找到了文件,但排除了其他 files/directories。我确实回应了这段代码并复制了它。如果我将它粘贴到终端中,它就可以工作。一些文件被排除在外。但是如果我从脚本中执行它,它不会按预期工作。

我试图转义我的变量,在 $()${} 之类的括号中引用它们,但没有任何效果。

我的查找代码如下所示:

find ${StartDirs[*]} $pat -print

实际上会这样执行:

find ./bin  -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print

上面的第二个代码在终端中有效,但在脚本中无效。 我做错了什么?

有关更多信息,我将尝试在下面粘贴必要的代码 我正在尝试进行备份并希望使用 find 和 cp 进行备份。我的脚本的大部分代码都被省略了。我认为下面的代码是解决这个问题所必需的最少代码。

StartDirs=();
ExcludedFiles=(); #files/directories which needs to be excluded

#check and store excluded files
CheckExcludedFile(){ #this function will be called over and over again by another function (getopts). It depends on the chain of -x options. With the -x option I can decide which file i want to exclude. The Getopts function is also omitted.

    exclFile=`find  2>/dev/null | wc -l` 
    if [ $exclFile -lt 1 ]; then
        echo $FILEMAPNOTEXIST | sed 's~-~''~g' # FILEMAPNOTEXIST is a variable from another script with error messages
        exit 0
    else
        ExcludedFiles+=() #add excluded file/dir path to array
    fi
}

MakeBackup(){
        for i in ${ExcludedFiles[*]}
        do
            s=" -wholename $i -prune -o"
            pat=$pat$s
        done
        # the code above edits the array elements of the EcludedFIles[]
        #For example by calling the script with the -x option (-x fileA -x fileB -x fileC) wordt als volgt: -wholename 'fileA' -prune -o -wholename 'fileB' -prune -o -wholename 'fileC' -prune -o.
        #the pat variable will be used for the find command to ignore files/directories

    mkdir -p ~/var

    echo "Start-time $(date '+%F %T')" >> ~/var/dq.log  

    find ./bin  -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print
    #the code above should work like in terminal. That is not the case..

    # find ${StartDirs[*]} $pat -print #this should work also.

    # cp -av ${StartDirs[@]} $Destination >> ~/var/dq.log find command not working therefore this rule is commented

    echo "end-time $(date '+%F %T')" >> ~/var/dq.log
}

预期的结果应该只是一些 files/directories 被排除在外。

如果需要完整的脚本,请告诉我。

命令 find ./bin -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print 应该可以正常工作,前提是当前目录位于 bin/. 的正上方 这可能是您遇到问题的原因:如果在真实脚本中,您 assemble 路径名称与找到的路径中的前缀不匹配,例如修剪不起作用。示例:您有一个目录 /home/me;其中是 bin/backup2/bin/backup3/stuff-to-backup/。现在,如果您在 /home/me 中并执行 find .,它会发现例如./bin/backup2 将被修剪。

但是如果你把它放在脚本中并使用路径参数调用脚本,例如/home/me,它会找到相同的文件,但路径会不同,例如/home/me/bin/backup2,并且不会修剪它,因为它与提供的排除模式不匹配,即使它们是相同的文件。 同样,-wholename 提供的任何模式都不会被发现。 是一个解决这个问题的问题。