在许多目录中选择特定目录

时间:2014-10-08 15:42:10

标签: linux bash shell scripting

我正在尝试编写一个shell脚本,它遍历父目录下的所有目录,并跳过在叶级别具有空文件夹“I_AM_Already_Processed”的目录。

父目录作为shell脚本的输入提供:

. selectiveIteration.sh /Employee

父目录下的结构如下所示 (员工目录包含按年度分叉的数据 - >每月 - >每日 - >每小时)

/Employee/alerts/output/2014/10/08/HOURS/Actual_Files

Shell脚本正在尝试找出尚未处理的目录。例如:

让我们考虑日期的三小时数据:2014年8月10日

1.  /USD/alerts/output/2014/10/08/2(hourly_directory)/Actual_file + 
     directory_with_name(I_AM_Already_Processed)
2.  /USD/alerts/output/2014/10/08/3(hourly_directory)/Actual_file + 
     directory_with_name(I_AM_Already_Processed)
3.  /USD/alerts/output/2014/10/08/(hourly_directory)/Actual_file 

在上面的示例中,叶子目录2和3已经被处理,因为它们包含名为的文件夹 “I_AM_Already_Processed”,而目录4尚未处理。

所以shell脚本应该跳过文件夹2,3,但应该处理目录4(在输出中打印此目录)。

我做过的研究/工作:

直到现在我能够遍历目录结构并遍历从root到leaf级别的所有文件夹/文件,但我不知道如何检查特定文件并跳过目录(如果该文件存在)。 (在参考StackOverflow上的一些教程和旧帖子后,我能够做到这一点)

我是shell脚本的新手,这是我第一次编写shell脚本,所以如果这个基本问题太问我请原谅。想学习。

欢迎任何建议。提前谢谢。

1 个答案:

答案 0 :(得分:0)

要检查是否已处理some_directory,只需执行类似

的操作
find some_directory -type d -links 2 -name 'I_AM_Already_Processed'

如果有目录名,将返回目录名,如果没有,则返回任何内容。注意-links 2测试目录是否为叶子(意味着它只包含指向其父级和自身的链接,但不包含指向任何子目录的链接)。有关详细信息,请参阅this answer

所以在脚本中,你可以做到

#!/bin/bash
directory_list=(/dir1 /dir2)
for dir in "${directory_list[@]}"; do 
if [[ -n $(find "$dir" -type d -links 2 -name 'I_AM_Already_Processed' -print -quit) ]]; then
  echo 'Has been processed'
else
  echo 'Has not been processed'
fi