在/bin/sh脚本中,我想检查目录是否只包含一个子目录而不包含其他文件(当然除了"."和"..").我可以解析输出ls,但我也明白这通常是一个坏主意.建议?
问题的原因:当我在zip一个文件夹上,比如一个Windows机器,我在Linux下解压缩它时,有时我会得到一个目录,其内容是原始文件夹的内容; 有时我得到一个目录只包含一个子目录,其内容是原始文件夹的内容.(我假设我zip在Windows下使用的方式有所不同,或者我使用的各种Windows机器配置略有不同,或者......谁知道?)总之,我想,在Linux方面,以大致相同的方式处理这两种结果,因此这个问题.
对于那些想"如果你的Windows端文件夹确实只包含一个子目录怎么办?"的人来说,在这种情况下就好了,尽管我认为这是问题规范的一个例子.
find将是一个很好的工具。它有一些巧妙的论点:
-maxdepth 1 所以它不会递归搜索-type d 只搜索目录-printf 1克服奇怪文件名的问题(打印1而不是文件名)完整的命令是:
find DIRECTORY -maxdepth 1 -type d -printf 1
Run Code Online (Sandbox Code Playgroud)
这将为每个目录加上目录本身打印一个字符,因此您正在寻找打印两个字符的目录(find 有一个很好的功能,可以忽略.和..搜索)。
然后,您要检查是否没有其他(非目录)文件:
find DIRECTORY -maxdepth 1 ! -type d -printf 1
Run Code Online (Sandbox Code Playgroud)
完整的检查将是:
if [ "$(find DIRECTORY -maxdepth 1 -type d -printf 1 | wc -m)" -eq 2 \
-a "$(find DIRECTORY -maxdepth 1 ! -type d -printf 1 | wc -m)" -eq 0 ]; then
# It has only one subdirectory and no other content
fi
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用-printf's%y打印文件类型(d用于目录)使其成为一个命令:
if [ "$(find DIRECTORY -maxdepth 1 -printf %y)" = "dd" ]; then
# It has only one subdirectory and no other content
fi
Run Code Online (Sandbox Code Playgroud)