Mar*_*ria 8 command-line shell files
我在一个文件夹中有 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而是小时。
如何找出文件夹中缺少哪个文件?我在谷歌中得到的答案很少,但无法弄清楚如何实现这些。
cha*_*aos 13
使用zsh或bash4,您可以为此使用大括号扩展:
ls -d GLDAS_NOAH025SUBP_3H.A2003{001..006}.{0000,0600,1200,1800}.001.2015210044609.pss.grb >/dev/null
Run Code Online (Sandbox Code Playgroud)
注意括号:
{001..006}表示扩展到001, 002, ...006{0000,0600,1200,1800}对上述每一项添加0000, 0600,1200和1800。>/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
Run Code Online (Sandbox Code Playgroud)
用ksh93,替换{001..006}为{1..6%.3d}。
@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
Run Code Online (Sandbox Code Playgroud)
或者
for a in {001..365}.{00..18..6}
do
[[ -f "GL.....2003${a}00.001.2015210044609.pss.grb" ]] || echo "$a"
done
Run Code Online (Sandbox Code Playgroud)
只打印缺少的天+小时
在循环中构建文件名,然后测试文件是否不存在:
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
Run Code Online (Sandbox Code Playgroud)
注意:我不保证这个例子没有错误。这是一个示例,而不是已知的工作脚本。
可移植性:需要ksh、bash或zsh以及具有可用 GNU 命令的系统seq。