我正在尝试检查文本文件中列出的文件名是否存在于目录中。如果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
答案 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变量(以及几乎任何其他用途的变量)。