如何打印文件夹中丢失文件的名称?


8

我的文件夹中有2000多个文件,但该文件夹中缺少几个文件。

文件名就像

GLDAS_NOAH025SUBP_3H.A2003 001.0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001.1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1800 .001.2015210044609.pss.grb

001表示日期,而0000表示小时。

如何找出文件夹中缺少哪个文件?我在Google那里得到的答案很少,但不知道如何实施这些答案。


您的意思是,每天从001到xyz必须有4个文件:0000、0600、1200和1800?如果不是,则应打印该名称?我理解这个正确吗?
混乱

在* nix中,我们称它们为“目录”,而不是文件夹。文件夹是Windows术语。
罗布(Rob)2015年

1
@chaos是001到365,是的,我明白了。
玛丽亚

3
@Rob:嗯。这两个术语都很好理解。实际上,苹果可能是在MS Windows甚至不存在之前,在MacOS首次发行时就提出了文件夹的隐喻。而且由于众所周知MacOS是UNIX,因此将文件夹称为UNIX术语:-)
Celada

2
文件夹和目录是非常不同的隐喻。Unix中的目录的行为与现实生活中的目录非常相似,而与现实生活中的文件夹不同,而Windows中的文件夹与现实目录相比,行为更像现实生活中的文件夹,因此使用术语“更紧密”是有意义的类似于相应的现实概念。我个人已经看到由于用户认为目录的行为类似于文件夹而导致的数据丢失,因为他的老师一直称其为文件夹而不是目录。
约尔格W¯¯米塔格

Answers:


13

使用zshbash4,您可以为此使用大括号扩展

ls -d GLDAS_NOAH025SUBP_3H.A2003{001..006}.{0000,0600,1200,1800}.001.2015210044609.pss.grb >/dev/null

注意括号:

  • {001..006}手段扩大到001002...006
  • {0000,0600,1200,1800}上述附加的每一位0000060012001800
  • >/dev/null是为了避免ls->我们只需要标准错误的标准输出

现在,如果一个文件不存在,ls将显示一个错误:

ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1800.001.2015210044609.pss.grb: No such file or directory

ksh93替换{001..006}{1..6%.3d}


2
酷.... + 1!
JJoao 2015年

谢谢,但是有365天,因此{001..006}无法在命令中扩展到该程度。为此该怎么做?
玛丽亚

3
@Maria为什么不呢,您尝试过吗{001..365},对我而言,它有效
混乱

1
另请参阅{0000..1800..600}表格。
斯特凡Chazelas

您实际上并不需要列表中的分钟。第二个大括号扩展可能是.{00,06,12,18}00.
WAF

7

@chaos解决方案的变体(bash 4.0或更高版本或zsh 4.3.11或更高版本):

for a in GL.....2003{001..365}.{00..18..6}00.001.2015210044609.pss.grb 
do  
  [[ -f $a ]] || echo "$a"
done

要么

for a in {001..365}.{00..18..6}
do
  [[ -f "GL.....2003${a}00.001.2015210044609.pss.grb" ]] || echo "$a"
done

仅打印缺少的日期和时间


4

虽然混沌的答案很好用在交互式外壳中,但是可以将其用作POSIX脚本,例如,如果需要定期执行此操作和/或在另一台计算机上执行此操作。

#!/bin/sh
i=0
while test "$((i+=1))" -lt 366 ; do
    for j in 00 06 12 18 ; do
        file="GLDAS_NOAH025SUBP_3H.A2003$(printf '%03d' "$i").${j}00.001.2015210044609.pss.grb"
        test -e "$file" || echo "$file"
    done
done

seq或大括号扩展未由POSIX指定。)


2

循环构建文件名,然后测试文件是否不存在:

for day in `seq -f "%03g" 1 30`
  do
  for hour in 0000 0600 1200 1800
    do
    filename="GLDAS_NOAH025SUBP_3H.A2003${day}.${hour}.001.2015210044609.pss.grb"
    if [[ ! -e $filename ]]
    then
      echo "File missing: $filename"
    fi
  done
done

注意:我不保证此示例没有错误。这是一个示例,而不是已知有效的脚本。

可移植性:需要kshbash或者zsh具有GNU seq命令的系统可用。


这个概念也是我所讨论的,但是请注意,朱利安(Julian)很少有30天的时间。
WAF
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.