Bash:查找不存在给定文件的任何子目录
我想知道我的文件是否存在于下面的任何子目录中。在我的shell脚本中,子目录是在上面的步骤中创建的,下面的代码总是告诉我该文件不存在(即使存在),并且我希望也打印路径Bash:查找不存在给定文件的任何子目录,bash,shell,subdirectory,Bash,Shell,Subdirectory,我想知道我的文件是否存在于下面的任何子目录中。在我的shell脚本中,子目录是在上面的步骤中创建的,下面的代码总是告诉我该文件不存在(即使存在),并且我希望也打印路径 #!/bin/bash .... if ! [[ -e [ **/**/somefile.txt && -s **/**/somefile.txt ]]; then echo "===> Warn: somefile.txt was not created in the following path
#!/bin/bash
....
if ! [[ -e [ **/**/somefile.txt && -s **/**/somefile.txt ]]; then
echo "===> Warn: somefile.txt was not created in the following path: "
# I want to be able to print the path in which file is not generated
exit 1
fi
我知道文件名是somefile.txt,它将在所有子目录中创建,但子目录名变化很大。。因此,globbing.首先--
***/somefile.txt
仅扩展到实际存在的somefile.txt
副本。如果您想找到不存在的,这意味着您需要遍历目录,并且不能在glob表达式中包含somefile.txt
。其次,您不能将glob表达式作为参数传递给-e
或-s
;这些测试表达式采用精确的路径名作为参数,或采用单个文件名。它们不接受glob或多个文件的列表(glob在某些上下文中可以扩展到这些文件)。第三,您需要运行shopt-s extglob
,以使**
具有任何特殊意义。(如果您习惯于在交互式shell中开箱即用,那么您的一个点文件可能正在为您运行它)。首先--**/somefile.txt
仅扩展到实际存在的somefile.txt
副本。如果您想找到不存在的,这意味着您需要遍历目录,并且不能在glob表达式中包含somefile.txt
。其次,您不能将glob表达式作为参数传递给-e
或-s
;这些测试表达式采用精确的路径名作为参数,或采用单个文件名。它们不接受glob或多个文件的列表(glob在某些上下文中可以扩展到这些文件)。第三,您需要运行shopt-s extglob
,以使**
具有任何特殊意义。(如果您习惯于在交互式shell中开箱即用,那么您的一个dotfiles可能正在为您运行它)。这太完美了!非常感谢查尔斯。我真希望有一些关于这方面的文档,但这正是我想要的。对于模式匹配(globbing)文档来说,这可能是一个很好的起点。深入讨论了test
、[
和[[
,这也是一个很好的参考。是否有其他内容可以帮助我找到文档?常见问题解答路径(已在书签中)语法模式链接对我帮助很大。我想我不需要更多的东西。再次感谢!这太完美了!非常感谢Charles。我真希望有一些关于这方面的文档,但这正是我想要的。这可能是关于模式匹配(globbing)的文档的一个很好的起点。讨论测试,[
和[[
在某些深度上,也是一个很好的参考。还有其他内容可以帮助我找到文档吗?常见问题解答路径(已经在书签中)和语法模式链接对我帮助很大。我想我不想为我正在做的事情多做一些。再次感谢!
#!/bin/bash
shopt -s extglob ## enable **, which by default has no special behavior
for d in **/; do
if ! [[ -s "$d/somefile.txt" ]]; then
echo "===> WARN: somefile.txt was not created (or is empty) in $d" >&2
exit 1
fi
done