我有一个包含子目录的目录,每个子目录包含特定的脚本和支持文件。我需要验证每个目录中是否存在正确的文件。这些目录可以随时更改,所以我想使用bash(我认为)并存储以下命令,该命令在数组中返回正确的子目录
find . -maxdepth 1 -type d -not -name home -not -name lhome -print
然后验证每个目录是否包含正确的文件:
file1 file2 file3.sh file4.conf
如果特定目录不包含这些文件,我需要知道哪个目录是问题,哪些文件丢失。实现这一目标的最佳/正确方法是什么?也许bash是错误的工具,perl或其他东西会更好?
答案 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
正如您所看到的,这有一些严重的缺点,因为预期文件列表会被写入两次。并且每个列表都存储在内存中,如果存在许多目录,这将导致问题。