我目前正在使用 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)
执行 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
从命令中删除。