linux - 如何测试Linux目录是否只包含一个子目录而没有其他文件?

标签 linux sh

/bin/sh 脚本中,我想检查一个目录是否只包含一个子目录而没有其他文件(当然除了“.”和“..”) .我可能可以解析 ls 的输出,但我也明白这通常是个坏主意。建议?

提问原因:当我zip一个文件夹,比方说,一台windows机器,我在Linux下解压它,有时我得到一个目录,其内容是原始文件夹的内容;有时我会得到一个只包含一个子目录的目录,其内容是原始文件夹的内容。 (我假设我在 Windows 下使用 zip 的方式有所不同,或者我使用的各种 Windows 机器的配置略有不同,或者......谁知道?)如何,我'我喜欢,在 Linux 方面,以或多或少相同的方式处理这两种结果,因此这个问题。

对于那些认为“如果您的 Windows 端文件夹真的确实只包含一个子目录怎么办?”,碰巧在这种情况下没关系,尽管我承认这是一个极端情况问题规范。

最佳答案

find 将是一个很好的工具。它有一些简洁的论点:

  • -maxdepth 1 所以它不会递归搜索
  • -type d 只搜索目录
  • -printf 1 解决奇怪文件名的问题(打印 1 而不是文件名)

完整的命令是:

find DIRECTORY -maxdepth 1 -type d -printf 1

这将为每个目录加上目录本身打印一个字符,因此您正在寻找打印两个字符的目录(查找有一个很好的功能,可以忽略 ... 搜索时)。

然后,您要检查是否没有其他(非目录)文件:

find DIRECTORY -maxdepth 1 ! -type d -printf 1

完整的检查将是:

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

或者,您可以使用 -printf%y 打印文件类型(d 表示目录)使其成为一个命令:

if [ "$(find DIRECTORY -maxdepth 1 -printf %y)" = "dd" ]; then
    # It has only one subdirectory and no other content
fi

关于linux - 如何测试Linux目录是否只包含一个子目录而没有其他文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429333/

相关文章:

java - 不能在 Runtime.exec() + linux 中使用 && 运算符

linux - $@ 在 shell 脚本中是什么意思?

javascript - 我正在尝试使用 nodejs 在 sh 中执行文件,但控制台告诉我找不到该文件

bash - 为什么 `(( 0 ))`在.sh脚本中返回值为1?

java.io.IOException : Cannot run program "": CreateProcess error=2, 系统找不到指定的文件

linux - 如何在 Mac 之外使用 Accelerate 框架

运行 CentOS7 的 Virtualmin 上的 php ldap 扩展

linux - 运行 playbook 时出错,仅影响其中一台主机

linux - 临时文件和套接字文件在主文件夹 Linux 中创建

bash - 如何将反斜杠参数传递给脚本?