linux - shell 脚本 : Check if file exists in directory from a list file

标签 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

最佳答案

您可以在 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/

相关文章:

mysql - 为什么将二进制文本通过管道传输到屏幕通常会导致终端崩溃

php - 如何在centos上安装PHP FileInfo模块

linux - 什么情况下是在前台或后台进行关闭/关闭?

bash - 将 stdout 和 stderr 都重定向到文件,仅打印 stdout

linux - Awk 命令无法正常工作,输出错误,sed 命令?

linux - shell 输出文件的奇怪行为 ( Linux )

linux - 如何在Linux上提取一行中的子字符串

linux - 理解 Linux 中的 read()

linux - GNU 并行 : execute one command parallel for all files in a folder

linux - 根据扩展标准移动文件的脚本