File 检查文件列表中的文件是否存在于某个目录中

File 检查文件列表中的文件是否存在于某个目录中,file,bash,unix,scripting,File,Bash,Unix,Scripting,运行时参数如下:$1是包含文件列表的文件的路径 $2是指向包含文件的目录的路径 我要做的是检查$1中列出的每个文件是否存在于$2目录中 我的想法是: for f in 'cat $1' do if (FILEEXISTSIN$2DIRECTORY) then echo '$f exists in $2' else echo '$f is missing in $2' sleep 5 exit fi done 正如您所看到的,我希望这样,如果$1中列出的任何文件不存在

运行时参数如下:
$1
是包含文件列表的文件的路径
$2
是指向包含文件的目录的路径 我要做的是检查
$1
中列出的每个文件是否存在于
$2
目录中

我的想法是:

for f in 'cat $1'
  do
  if (FILEEXISTSIN$2DIRECTORY)
    then echo '$f exists in $2'
    else echo '$f is missing in $2' sleep 5 exit
  fi
done
正如您所看到的,我希望这样,如果
$1
中列出的任何文件不存在于
$2
目录中,脚本会声明这一点,然后关闭。我唯一不能理解的部分是(FILEEXISTSIN$2DIRECTORY)部分。我知道您可以执行
[-e$f]
,但我不知道如何确保它检查$2目录中是否存在


编辑:进一步考虑一下,也许我可以使用嵌套for循环?

因为您处理的文件名列表中的名称中没有空格(因为
$(cat$1)
符号将这样分割),所以它相对简单:

for file in $(cat $1)
do
    if [ -e "$2/$file" ]
    then echo "$file exists in $2"
    else echo "$file is missing in $2"; sleep 5; exit 1
    fi
done
基本上,使用内置的字符串连接工具构建文件的完整路径,并使用
test
[
操作符检查文件是否存在


如果您必须处理任意文件名,尤其是任意文件名中的任意字符之一可能是换行符,则会出现复杂性。可以说,它们使问题变得非常复杂,除非您说需要处理它,否则我不会处理它,即使这样,我也会协商是否使用换行符名称需要处理。双引号变量扩展是处理它的策略的关键部分。问题的另一部分是如何将文件名准确地放入变量中。

如果指定的输入文件包含要检查的文件的换行分隔列表,则以下解决方案(使用while read循环)足够健壮,可以正确处理带有空格的文件名

通常,您不应该使用形式为“
”的循环,而应该选择while循环。有关更多详细信息,请参阅

while read -r file; do
   if [[ -e "$2/$file" ]]; then
      echo "$f exists in $2"
   else
      echo "$f does not exist in $2"
      sleep 5
      exit 1
   fi
done < "$1"
读取-r文件时;执行以下操作
如果[[-e“$2/$file”]];则
回显“$f存在于$2中”
其他的
回显“$2中不存在$f”
睡眠5
出口1
fi
完成<“$1”

这应该很有效。在您看来,使用for循环最适合这些类型的过程,还是使用while循环更好?再次感谢您。若要处理文件名中不包含换行符或前导空格或尾随空格的文件名,我可能会在读取文件时使用
;do…;done
。如果您确实需要对于那些在文件名中使用换行符或前导空格或尾随空格的恶棍,你必须非常努力地工作。为了保留前导空格和尾随空格,你可以在读取文件时使用
IFS='';do…;done
。我从来没有遇到过足够顽固的人;任何这样的文件名都是一次性的意外事件,都会被删除命名。文件名不包含空格,因此我可以使用空格将其分解为单个文件。在本例中,使用for循环是否可以接受?如果不能,我是否必须更改上面代码中的任何内容以使其正常工作?:)如果保证文件名不包含空格字符,则使用for的方法将工作,但我还是不推荐,这是一个坏习惯。嵌套循环会给你带来什么好处?是的,如果你能找到一种合理的使用方法,你可以使用嵌套循环。OTOH,对于你的问题,没有必要使用它们。