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

Bash 查找并验证子文件夹中的内容,bash,Bash,我有一个包含子目录的目录,每个子目录包含一个特定的脚本和支持文件。我需要验证每个目录中是否有适当的文件。这些目录可以随时更改,因此我想使用bash并存储以下命令,该命令将在数组中返回正确的子目录 find . -maxdepth 1 -type d -not -name home -not -name lhome -print 然后验证每个目录是否包含正确的文件: file1 file2 file3.sh file4.conf 如果某个特定目录不包含这些文件,我需要知道哪个目录是问题所在,哪些

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

find . -maxdepth 1 -type d -not -name home -not -name lhome -print
然后验证每个目录是否包含正确的文件:

file1 file2 file3.sh file4.conf


如果某个特定目录不包含这些文件,我需要知道哪个目录是问题所在,哪些文件丢失。实现该目标的最佳/适当方式是什么?也许bash是错误的工具,perl或其他更好的工具?

可能有一种更为集成的方法,但下面是我的尝试:

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)
读取-rd''目录时;做
files=(“file1”“file2”“$directory.sh”“$directory.conf”)
对于“${files[@]}”中的文件;做
如果[!-e“$directory/$file”];然后
echo“$目录缺少$文件”
fi
完成

完成<我认为这样做可能会奏效:

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})
然后使用现有文件生成另一个列表:

c/file1
c/file2
现在缺少的只是比较两个列表以找出差异:

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

正如您所看到的,这有一些严重的缺点,例如,预期文件的列表被写入了两次。每个列表都存储在内存中,如果存在多个目录,就会出现问题。

Bash可以工作,但在这种情况下,我会使用python或perl。您只需要将结果打印到控制台吗?很好:)我的建议是将
-print0
与find一起使用,将
-d''
read一起使用,以处理非标准目录名称如果,比如说…我是个白痴…忘记file3.sh和file4.conf与它们的目录名称相同,该怎么办?我怎样才能在变量出现之前让它出现呢?然后在第一级循环中定义文件,并使用现有的
$directory
变量,例如
FILES=“file1 file2$directory.sh$directory.conf”
@sjsam谢谢,我编辑了我的答案以包含您的建议谢谢!这是一个更大的“问题”的一小部分,我现在有了一个很好的开始。非常感谢!
2,5d1
< c/file2
< c/file3.sh
< c/file4.conf
< d/file1
7,8d2
< d/file3.sh
< d/file4.conf