Shell 查找“发出意外的”&引用;,使wc-l列表中的内容超出预期

Shell 查找“发出意外的”&引用;,使wc-l列表中的内容超出预期,shell,unix,scripting,find,Shell,Unix,Scripting,Find,我正在尝试使用更新的命令,如下所示: touch $HOME/mark.start -d "$d1" touch $HOME/mark.end -d "$d2" SF=$HOME/mark.start EF=$HOME/mark.end find . -newer $SF ! -newer $EF 但这给了我这样一个输出: . ./File5 并将其计为2个文件,但该目录只有1个文件,即File5。为什么会发生这种情况以及如何解决 更新: 我实际上正在尝试运行以下脚本: #!/bin/bas

我正在尝试使用更新的命令,如下所示:

touch $HOME/mark.start -d "$d1"
touch $HOME/mark.end -d "$d2"
SF=$HOME/mark.start
EF=$HOME/mark.end
find . -newer $SF ! -newer $EF
但这给了我这样一个输出:

.
./File5
并将其计为2个文件,但该目录只有1个文件,即File5。为什么会发生这种情况以及如何解决

更新

我实际上正在尝试运行以下脚本:

#!/bin/bash
check_dir () {
  d1=$2
  d2=$((d1+1))
  f1=`mktemp`
  f2=`mktemp`
  touch -d $d1 $f1
  touch -d $d2 $f2
  n=$(find $1 \( -name "*$d1*" \) -o \( -newer $f1 ! -newer $f2 \) | wc -l)
  if [ $n != $3 ]; then echo $1 "=" $n ; fi
  rm -f $f1 $f2
}
检查目录中的文件是否具有格式为YYYYMMDD的特定日期,或者其上次修改时间是否为最后1天

check_dir ./dir1 20151215 4
check_dir ./dir2 20151215 3
其中,在dir1中应该有4个这样的文件,如果不是真的,那么它将打印存在其中的实际文件数


因此,当目录名称中只有日期的文件时,它会很好地检查这些文件,但当它检查较新的文件时,它总是额外提供1个文件(甚至在目录中都没有)。为什么会发生这种情况?

问题是为什么在
查找
的结果中会有额外的
,即使没有该名称的文件或目录。答案很简单:
总是存在,即使它是隐藏的。使用
ls-a
显示隐藏的内容,您将看到它的存在


您现有的
find
命令并不能免除目标目录本身--
--成为合法结果的责任,这就是为什么您得到的结果比预期的多

添加以下筛选器:

-mindepth 1  # only include content **under** the file or directory specified
…或者,如果您只想计算文件数,请使用


顺便说一句,假设GNU find,这一切都可以变得更加高效:

check_dir() {
  local d1 d2 # otherwise these variables leak into global scope
  d1=$2
  d2=$(gdate -d "+ 1 day $d1" '+%Y%m%d') # assuming GNU date is installed as gdate
  n=$(find "$1" -mindepth 1 \
                -name "*${d1}*" -o \
                '(' -newermt "$d1" '!' -newermt "$d2" ')' \
                -printf '\n' | wc -l)
  if (( n != $3 )); then
    echo "$1 = $n"
  fi
}

这是测试用例的一个很好的开始。也许您可以设置d1和d2的值,并在它们之间的某个位置创建一个文件,以拥有一个完全独立的复制机?(也许可以在$HOME以外的地方创建内容以便于清理?)此外,与您的实际问题无关,这里有一堆引用错误;同样,这里有很多不可移植的用法,所以不是每个人都能运行你的测试。例如,并非所有版本的
touch
都允许选项跟随位置参数——POSIX标准只要求
touch
在选项先到的情况下工作。@CharlesDuffy我用我真正的问题更新了问题。我只是想弄明白为什么会这样。你能帮帮我吗?啊!使用
-mindepth 1
豁免目录本身。哦!我已经试过了,但不幸的是,我的发现不支持newermt(有一个原因,我只是对我的答案做了一个补充,而不是整个问题。顺便说一句,如果你不需要递归,那么你使用
find
,而不是仅仅在bash中执行本机逻辑,有什么原因吗?是的,我需要检查文件名中有特定日期或最后一次修改的文件所有目录中的1天。顺便说一句,我能再问你一件事吗。我正在做的d2=$((d1+1))计算第二天的日期,但对于像20151231这样的月末日期,这不起作用。我如何添加该例外?
check_dir() {
  local d1 d2 # otherwise these variables leak into global scope
  d1=$2
  d2=$(gdate -d "+ 1 day $d1" '+%Y%m%d') # assuming GNU date is installed as gdate
  n=$(find "$1" -mindepth 1 \
                -name "*${d1}*" -o \
                '(' -newermt "$d1" '!' -newermt "$d2" ')' \
                -printf '\n' | wc -l)
  if (( n != $3 )); then
    echo "$1 = $n"
  fi
}