脚本通过atime输出帮助FIND命令到多个文件

这里是我写的脚本,我需要帮助。 在脚本中,我会查找任何超过30天,60天,90天,180天,270天和365天都无法访问的文件。

这工作得很好。 然而,这需要几天才能完成30天的部分。 它正在扫描一个NAS。 (数百万和数百万个文件),30天的信息确实保存了其余脚本所需的所有数据。 脚本的60,90等部分只是重复与30天部分相同的工作,除了延长的时间框。 在这种情况下,如果某些60,90,180等部分能够从30天的输出中获得数据,则可以节省数周的重新扫描。

这是我寻求帮助的地方。 输出就像一个ls -l命令。 你也可以从下面的输出中看到,这个输出有多年。 该脚本附加并打印在下面。

total 24 -rw-r--r-- 1 root bin 60 Apr 12 13:07 config_file -rw-r--r-- 1 root bin 9 Apr 12 13:07 config_file.InProgress -rw-r--r-- 1 root bin 0 Apr 12 13:07 config_file.sids -rw-r--r-- 1 root bin 1284 Apr 19 10:41 rpt_file -rw-r--r-- 1 16074 5003 20083 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/console/dat1_01.gif -rw-r--r-- 1 16074 5003 20088 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/console/set1_04.gif -rw-r--r-- 1 16074 5003 2008 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/oapps/get2_03.htm -rw-r--r-- 1 16074 5003 20083 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/oapps/per1_01.gif 

任何帮助表示赞赏。 这些是Linux发行版,所以我相信如果需要的话,Perl也在那里。

 #!/bin/ksh ############################################ # search shares for files # # that have not been accessed # # for a certain time. # # NOTE: # # $IN = input search # # $OUT = output directory for text file # ########################################################## # TESTS # # Numeric arguments can be specified as # # # # +n for greater than n, # # -n for less than n, # # n for exactly n. # # # # -atime n # # File was last accessed n*24 hours ago. # # # ########################################################## IN1=/nas/quota/slot_2/CR* IN2=/nas/quota/slot_3/CR* IN3=/nas/quota/slot_4/CR* IN4=/nas/quota/slot_5/CR* OUT=/nas/quota/slot_3/CR_PRJ144/steve mkdir ${OUT} for dir in ${IN1}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done for dir in ${IN2}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done for dir in ${IN3}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done for dir in ${IN4}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done for dir in ${IN1}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done for dir in ${IN2}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done for dir in ${IN3}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done for dir in ${IN4}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done for dir in ${IN1}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done for dir in ${IN2}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done for dir in ${IN3}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done for dir in ${IN4}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done for dir in ${IN1}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done for dir in ${IN2}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done for dir in ${IN3}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done for dir in ${IN4}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done for dir in ${IN1}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done for dir in ${IN2}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done for dir in ${IN3}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done for dir in ${IN4}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done for dir in ${IN1}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done for dir in ${IN2}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done for dir in ${IN3}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done for dir in ${IN4}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done 

你需要重新devise。 您应该只在整个系统上运行一次find命令,并创build一个包含“file:atime”之类的索引文件。 你可以通过使用-printf参数来find打印文件名的时间(参见man find )。 然后,您可以根据该索引执行操作。 原因是最大的惩罚将是在磁盘上陈述每个文件,所以你只想做一次。 这是Linux上locate和updatedb命令的思想。 基本上你想要重新创build一个新的时间。

我也认为循环ls是蹩脚的,你可能想循环索引一行行while循环。 你将不得不把这些时间复制到'x天前'。 最简单的方法可能是使用时代。 所以你最终会得到像这样的东西:

 find ~/scrap -printf "%p:%A@%\n" > index; while read -d':' name date; do if ...between dates using $date...; then do something to $name fi done < index 

如果你想要而不是上面你已经find命令pipe道到while循环,并根据if语句redirect到不同的文件。 另外,请记住:如果可能在文件名中使用,则是错误的分隔符。

如果你想更有趣,你可能想要在SQL中生成索引。

脚本有几个问题导致它运行得太慢。 首先你的for循环在编写的时候是不必要的,每个variables只有一个值,用你自己想要的方式来使用它,你也可以改变它的结构:

 IN_PATH=" /nas/quota/slot_2/CR* /nas/quota/slot_3/CR* /nas/quota/slot_4/CR* /nas/quota/slot_5/CR* " OUT=/nas/quota/slot_3/CR_PRJ144/steve mkdir ${OUT} for dir in ${IN_PATH}; do find $dir +atime 30 for dir in ${IN_PATH}; do find $dir +atime 60 for dir in ${IN_PATH}; do find $dir +atime 90 

等等..

但是,这仍然使整个NAS文件系统find每个文件循环…慢! 由于我们正在检查一个时间,我们必须对这些文件进行统计,但是为什么不能只做一次呢? 假设你有一个标准的GNU Linux机器,你应该可以做这样的事情:

 find /nas/quota/ \(+atime 365 -fls /root/365.txt\), \(+atime 180 -fls /root/180.txt\), etc... 

现在我正在从内存中完成这个工作,所以可能需要做一些调整才能正确工作,在Web根目录下进行testing,或者您是主目录,这些内容可以快速运行以帮助解决问题。 查找将接受多个expression式,如果你通读手册页的优先节,你可以做一些漂亮的事情。 取决于你想要用这个信息做什么,你也可以为atime检查添加限制,例如:

 \(+atime 180 -a -atime 364 -fls /root/more_than_180_but_less_than_365.txt \) 

如果只需要几天时间来完成search的部分,就意味着您的脚本正在循环某个不应该的地方。 最重要的是,你正在做recursion查找一遍又一遍…..

另外,请尝试格式化您的post。 这看起来像是一个不可读的文本块。