查找并验证子文件夹中的内容

时间:2016-07-05 12:17:10

标签: bash

我有一个包含子目录的目录,每个子目录包含特定的脚本和支持文件。我需要验证每个目录中是否存在正确的文件。这些目录可以随时更改,所以我想使用bash(我认为)并存储以下命令,该命令在数组中返回正确的子目录

find . -maxdepth 1 -type d -not -name home -not -name lhome -print

然后验证每个目录是否包含正确的文件:

file1 file2 file3.sh file4.conf

如果特定目录不包含这些文件,我需要知道哪个目录是问题,哪些文件丢失。实现这一目标的最佳/正确方法是什么?也许bash是错误的工具,perl或其他东西会更好?

2 个答案:

答案 0 :(得分:2)

可能有一种更加综合的方式,但是我的注意力在于它:

while read -rd '' directory; do
    files=("file1" "file2" "$directory.sh" "$directory.conf")
    for file in "${files[@]}"; do
        if [ ! -e "$directory/$file" ]; then
            echo "$directory is missing $file"
        fi
    done
done <  <(find . -maxdepth 1 -type d -not -name home -not -name lhome -print0)

请注意,此find也会返回当前目录。如果您希望避免这种情况,可能需要添加-mindepth 1选项。

另外,为了使其成为一个脚本,您可能希望将find kocation .替换为$1,以便您可以更灵活地指定目标。

答案 1 :(得分:0)

我觉得这样的事情可能有用:

shopt -s nullglob extglob
diff <(while IFS= read -r f; do printf "%s\n" "$f/"{file1,file2,file3.sh,file4.conf}; done < <(printf "%s\n" !(home|lhome))) \
     <(printf "%s\n" !(home|lhome)/{file1,file2,file3.sh,file4.conf})

基本上发生的事情是,while循环生成所有可能文件的列表,如:

c/file1
c/file2
c/file3.sh
c/file4.conf
d/file1
d/file2
d/file3.sh
d/file4.conf

然后使用现有文件生成另一个列表:

c/file1
c/file2

现在缺少的是比较两个列表以找出差异:

2,5d1
< c/file2
< c/file3.sh
< c/file4.conf
< d/file1
7,8d2
< d/file3.sh
< d/file4.conf

正如您所看到的,这有一些严重的缺点,因为预期文件列表会被写入两次。并且每个列表都存储在内存中,如果存在许多目录,这将导致问题。