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

时间:2013-01-05 17:11:52

标签: 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目录中不存在$2中列出的任何文件时,脚本会对此进行说明然后关闭。我无法理解的唯一部分是(FILEEXISTSIN $ 2DIRECTORY)部分。我知道您可以[ -e $f ],但我不知道如何确保它检查它是否存在于$ 2目录中。

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

2 个答案:

答案 0 :(得分:2)

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

通常,您不应该使用for i in $(command)形式的循环,而是选择while循环。有关详细信息,请参阅http://mywiki.wooledge.org/DontReadLinesWithFor

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"

答案 1 :(得分:0)

由于您正在处理名称中没有空格的文件名列表(因为$(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[运算符来检查文件是否存在。

如果必须处理任意文件名,则会出现复杂性,特别是如果任意文件名中的任意一个字符可能是换行符。可以说,它们使问题充分复杂化,除非你说你需要处理它,否则我不会处理它,即便如此,我还会就是否需要处理名称中的换行进行协商。双引号变量扩展是处理它的策略的关键部分。问题的另一部分是如何准确地将文件名转换为变量。