从文本文件的列表中检查文件是否存在(Linux)?

2nbm6dog  于 11个月前  发布在  Linux
关注(0)|答案(2)|浏览(113)

使用UNIX/Linux,一个简单的解决方案是:

for i in $(< mylist.txt ); do
  if [ ! -r $i ] ; then
    echo "file missing!  $i"
    exit 1
  fi
done

字符串
然而,如果每行只指定一个文件,但文件名可能包含空格,则会中断。文件名中的空格在用户中很流行,但程序员不喜欢,这是有原因的。我尝试添加引号,但这不起作用:在for命令中,空格被视为空格。
我怎么能用简单的方法解决这个问题呢?

vuv7lop3

vuv7lop31#

for循环总是在空白处分割输入。
我们可以将输入分隔符IFS改为仅使用换行符作为分隔符:

#!/bin/sh
(
    IFS='
'
    for i in $(cat mylist.txt)
    do
        if [ ! -r "$i" ]
        then
            echo "file missing!  $i" >&2
            exit 1
        fi
    done
)

字符串
一个更简单的and better替代方案是在while循环中使用read

#!/bin/sh
while IFS= read -r i
do
    if [ ! -r "$i" ]
    then
        echo "file missing!  $i" >&2
        exit 1
    fi
done <mylist.txt


还请注意,我们需要在[命令中引用$i的扩展,错误消息应该转到错误流。
此外,它只使用可移植的结构;没有必要将其限制为只使用Bash。

e0bqpujr

e0bqpujr2#

这里有一个简单的解决方案,“read”命令一次读取一行:

cat mylist.txt | while read i; do
  if [ ! -r "$i" ] ; then
    echo "file missing!  $i"
    exit 1
  fi
done

字符串

相关问题