Shell脚本:检查列表文件中的文件是否存在于目录中

时间:2017-04-26 03:33:34

标签: linux bash shell

我正在尝试检查文本文件中列出的文件名是否存在于目录中。如果medialist.txt中的文件名存在于medialab目录中,则将文件名放在foundfiles.txt中,否则将文件名放在lostfiles.txt中。我遇到困难的地方是将一个文件名从medialist.txt传递到if语句中。如何将单个文件名从medialist.txt传递给if语句?

以下代码块是我到目前为止所提出的。

for i in $(cat /home/user/Downloads/medialab/medialist.txt)
do
   if [[ $([[ -e $i ]]) == $(ls /home/user/Downloads/medialab/)  ]]
   then
           echo "$i" > /home/user/foundfiles.txt
   else
           echo "$i" > /home/user/lostfiles.txt
   fi
done

我在if语句中尝试过xargs命令。这将替换上面for循环中的当前if语句。我会删除LS变量,它只是用于自己测试if语句。 这是一个例子:

LS=$(ls /home/user/Downloads/medialab/)

if [[ -e $(xargs echo "$LS") ]]
then    
    echo "$i" > /home/user/foundfiles.txt
else    
    echo "$i" > /home/user/lostfiles.txt
fi

1 个答案:

答案 0 :(得分:0)

你可以在while循环中读取文件并检查路径是否是-f(检查给定路径是文件)开关的文件,如下所示:

while read -r || [[ -n $REPLY ]]; do
    [[ -z $REPLY ]] && continue
    if [[ -f "/home/user/Downloads/medialab/${REPLY}" ]]; then
        echo "$REPLY" >> "/home/user/foundfiles.txt"
    else
        echo "$REPLY" >> "/home/user/lostfiles.txt"
    fi
done < "/home/user/Downloads/medialab/medialist.txt"

这里发生的是我们通过重定向到while循环读取inputfile,使用read使用内置$REPLY变量将输入读入变量,然后|| [[ -n $REPLY ]]处理一个不以换行结束的输入文件。

接下来,我们使用-z检查变量是否为空,这会处理文件中间的空行,并使用continue跳过它们。

然后我们检查现在填充的$REPLY变量中的字符串是否是带-f的文件(将文件名扩展为引号中路径的一部分)并附加{{1}的相应文件}}

注意如何使用>>作为测试,您不需要引用LHS变量,但您需要引用RHS变量(以及几乎任何其他用途的变量)。