【问题标题】:Check whether files in a file list exist in a certain directory检查文件列表中的文件是否存在于某个目录中
【发布时间】:2012-12-19 21:36:21
【问题描述】:

运行时参数如下:$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 循环?

【问题讨论】:

  • 嵌套循环能给你带来什么好处?是的,如果你能找到一种合理的使用方式,你可以使用嵌套循环。 OTOH,对于您的问题,不需要它们。

标签: file bash unix scripting


【解决方案1】:

如果您指定的输入文件包含以换行符分隔的要检查的文件列表,则以下解决方案(使用 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"

【讨论】:

  • 文件名不包含空格,所以我可以使用空格将它们分成单独的文件。在这种情况下,是否可以使用 for 循环?如果没有,我是否必须更改上面代码中的任何内容才能使其正常工作?:)
  • 如果你保证文件名不包含空格字符,那么使用 for 的方法会起作用,但我仍然不推荐它,这是一个坏习惯。
【解决方案2】:

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

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

【讨论】:

  • 这应该很好用。在您看来,对于这些类型的过程,是使用 for 循环最好,还是使用 while 循环更好?再次感谢您。
  • 要处理文件名,除了那些在名称中包含换行符或前导或尾随空格的文件名,我可能会使用while read file; do ...; done &lt; input-file。如果您真的必须处理在文件名中使用换行符或前导或尾随空格的不法分子,那么您必须非常努力。要保留前导和尾随空格,您可以使用IFS=''; while read file; do ...; done &lt; input-file。我从来不需要与足够顽固的人打交道。任何此类文件名都是被重命名的一次性事故。
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2012-06-28
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多