Bash 在for if语句中查找文件和tar

Bash 在for if语句中查找文件和tar,bash,scripting,Bash,Scripting,正在尝试创建一个if语句,该语句将在某个位置使用用户名进行搜索,以查看是否已完成tar。如果没有,则在某个位置创建所述焦油。出于某种原因,我的查找是通过then echo命令运行的,不管该位置是否有文件 USER_LIST="$(awk '{print $3}' usernamefile.txt)" for USER_NAME in $USER_LIST;do echo $USER_NAME if find /location/to/store/tarfile

正在尝试创建一个if语句,该语句将在某个位置使用用户名进行搜索,以查看是否已完成tar。如果没有,则在某个位置创建所述焦油。出于某种原因,我的查找是通过then echo命令运行的,不管该位置是否有文件

USER_LIST="$(awk '{print $3}' usernamefile.txt)" 
for USER_NAME in $USER_LIST;do
   echo $USER_NAME
   if find /location/to/store/tarfile -type f -iname $USER_NAME; 
    then
        echo "tar file has been found for" $USER_NAME "/location/to/store/tarfile" `date` >> /logfile/log.txt   
    else
    FILE_LOC="$(awk -v $USER_NAME=$3 '{print $5;}' usernamefile.txt)" 
    tar -czvf ${USER_NAME}.tar.gz /location/to/put/tar/file $FILE_LOC
        echo "tar exit code:" $? $USER_NAME "has been archived" `date` >> /logfile/log.txt

    fi
done

我不知道为什么,但如果发现什么都没有。当然应该转到脚本的其他部分?该计划正在创建tar文件,如
.tar.gz

关键是您不知道如何捕获
find
的结果:这给出了一个文件列表,符合您在
find
语句中添加的条件。所以,最好的办法是对它们进行计数:如果没有,那么就没有这样的文件,所以得到如下结果:

if $(find /location/to/store/tarfile -type f -iname $USER_NAME | wc -l) 
then
  ...

|wc-l
读取找到的文件数。如果找到一个文件,结果不等于0,因此它会被解释为
TRUE

使用
test
命令最适合我的需要,使用
-f
-e
标志。

听起来太宽泛了。请把你的问题限制在一个单一的、明确的问题上,并提供一个答案。我不确定我还能限制多少,因为我觉得这很明显。。。我正在试图弄清楚为什么查找总是按到then,而不移动到其他位置,不管它是否能找到文件。查找的退出状态不取决于它是否找到文件,请阅读手册,尤其是“退出状态”部分。此外,如果find命令有问题,则不需要包含整个脚本;我的程序正在运行,但我想知道是否有更好的方法来实现这一点?除非你清楚地说明你的程序出了什么问题,否则它是离题的。你的
if
语句应该是这样的:
if find…args…|grep-q;然后…
如果[-n”$(查找…args…);然后…
如果这是OP想要的,那么这个问题就是重复的,你已经知道你不应该回答重复的问题了。因此downvote@oguzismail当然,SOF是一个交流和协作的地方。如果有重复的问题,我以前搜索我的问题时没有找到。多亏了你和多米尼克,我现在知道我的问题是什么了。问重复的问题没有什么错,它们可以很容易地删除。但是回答重复的问题是有害的,因为它会分割有价值的信息。这个答案是不正确的。
if
语句不会像那样工作。除了“签出退出状态”之外,您可以推荐其他命令吗