我正在尝试检查文本文件中列出的文件名是否存在于目录中。如果 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
最佳答案
您可以在 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 循环,使用 read
使用内置的 $REPLY
变量将输入读入变量, 然后 || [[ -n $REPLY ]]
处理不以换行符结尾的输入文件。
接下来我们使用 -z
检查变量是否为空,这会处理文件中间的空行并使用 continue
跳过它们。
然后我们检查现在填充的 $REPLY
变量中的字符串是否是带有 -f
的文件(将文件名扩展为引号中路径的一部分)和用 >>>
附加适当的文件。
请注意如何使用 [[
作为测试,您不需要引用 LHS 变量,但您需要引用 RHS 变量(以及几乎任何其他用途的变量).
关于linux - shell 脚本 : Check if file exists in directory from a list file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43624539/