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

kar*_*ten 1 linux bash

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

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

但是,如果每行仅指定一个文件,但文件名可能包含空格,则会中断。文件名中的空格在用户中很受欢迎,但在程序员中却不受欢迎,这是有原因的。我尝试添加引号,但这不起作用:在 for 命令中,空格被用作分隔符。

我怎样才能以简单的方式解决这个问题?

Tob*_*ght 7

循环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
)
Run Code Online (Sandbox Code Playgroud)

一个更简单、更好的read替代方法是在循环中使用while

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

$i还要注意,我们需要在命令中引用扩展[,并且错误消息应该转到错误流。

此外,这仅使用可移植的结构;无需将其限制为仅限 Bash。