我正在尝试编写一个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脚本,所以如果这个基本问题太问我请原谅。想学习。
欢迎任何建议。提前谢谢。
答案 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