bash if 语句帮助

-2 shell bash for

我目前正在使用 2 个脚本。1个脚本按年份过滤文件。第二个脚本位于年子文件夹中,按月 # (01-12) 过滤。

有什么比我下面的更好的吗?

所有文件都在 1 个目录中:

来源:./tape_backup/sync1/*(140 万个文件)目标:./tape_backup/<1990 - 2019>/<01-12>/(按年/月组织)

文件名的语法:A1000_T195_R256393_D120498 094600

_D = 不重要

D = 日期开始

1-2 = 月

3-4 = 天(不重要)

5-6 = 年

7-* = 时间戳(不重要)

因此,为什么我做整个D????98

读起来像这样的东西:

for f in ./sync1 do
(检查月份和年份,然后将其 mv 放入月份和年份文件夹 /)
完成

我在 Cygwin 和服务器 2012 r2

#C:/cygwin/bin/bash
for filename in ./* ; do
 if [[ $filename == *D??90 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1990/

 elif [[ $filename == *D??91 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1991/

 elif [[ $filename == *D??92 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1992/

 elif [[ $filename == *D??93 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1993/

 elif [[ $filename == *D??94 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1994/

 elif [[ $filename == *D??95 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1995/

 elif [[ $filename == *D??96 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1996/

 elif [[ $filename == *D??97 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1997/

 elif [[ $filename == *D??98 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1998/

 elif [[ $filename == *D??99 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/1999/

 elif [[ $filename == *D??00 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2000/

 elif [[ $filename == *D??01 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2001/

 elif [[ $filename == *D??02 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2002/

 elif [[ $filename == *D??03 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2003/

 elif [[ $filename == *D??04 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2004/

 elif [[ $filename == *D??05 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2005/

 elif [[ $filename == *D??06 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2006/

 elif [[ $filename == *D??07 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2007/

 elif [[ $filename == *D??08 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2008/

 elif [[ $filename == *D??09 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2009/

 elif [[ $filename == *D??10 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2010/

 elif [[ $filename == *D??11 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2011/

 elif [[ $filename == *D??12 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2012/

 elif [[ $filename == *D??13 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2013/

 elif [[ $filename == *D??14 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2014/

 elif [[ $filename == *D??15 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2015/

 elif [[ $filename == *D??16 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2016/

 elif [[ $filename == *D??17 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2017/

 elif [[ $filename == *D??18 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2018/

 elif [[ $filename == *D??19 ]] ; then
      mv $filename /cygdrive/d/RAID5/RAID200/invoices/1/2019/
 fi
done
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

执行 140 万次调用以mv在不同驱动器之间移动事物会很慢。尽量mv少打电话。

假设??您的模式中的 应该与世纪相匹配:

for year in {1990..2019}; do
    find . -maxdepth 1 -type f -name "*D$year" \
        -exec mv -t "/cygdrive/d/RAID5/RAID200/invoices/1/$year/" {} +
done
Run Code Online (Sandbox Code Playgroud)

这将循环所有相关年份。对于每一年,它将执行一个find命令,该命令将一次批量移动尽可能多的与给定模式匹配的文件。

该代码假定您将 GNU mv(作为-t选项)和 GNU find(或任何find具有-maxdepth)与bash. 如果您的源目录不包含任何子目录,那么您可以-maxdepth 1从命令中删除。