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 循环?

4

2 回答 2

2

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

通常,您永远不应该使用 form 的循环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"
于 2013-01-05T18:44:42.633 回答
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

基本上,使用内置的字符串连接工具来构建文件的完整路径,并使用testor[运算符来检查文件是否存在。

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

于 2013-01-05T17:23:10.207 回答