获取层次结构中的目录列表,其中仅包含符号链接

获取层次结构中的目录列表,其中仅包含符号链接

我知道有各种工具可用于获取层次结构中的目录列表,其中仅包含符号链接,但我不够熟练,无法自己发明解决方案。

就我个人而言,我必须使用 tcsh 来执行此操作。

我遇到的另一问题是如何执行相同的操作,但仅列出包含至少一个符号链接和至少一个其他文件的目录。

答案1

仅具有符号链接的目录将在目录树中留下叶子,就好像它们不包含目录一样,因此也包含非符号链接。

在 Solaris 上,至少对于 UFS 和 ZFS 文件系统,您应该能够搜索链接少于 3 个的目录。

find . -type d -links -3 -exec sh -c 'ls -Anq "$0" | awk "NR==1{next};/^[^l]/{exit 1};END{if (NR<2) {exit 1}}"' {} \; -print

对于至少具有一个符号链接和一个非符号链接的目录,您需要检查每个目录:

find . -type d -exec sh -c 'ls -Anq "$0" | awk "NR==1{next};/^[^l]/{nonlink++};/^l/{link++}; END{exit !(link&&nonlink)}"' {} \; -print

答案2

一种方法是使用shGNU find,并假设文件名没有嵌入换行符:

#! /bin/sh
find /path/to/dir -type d -links 2 | \
    while read -r d; do
        found=0
        for f in "$d"/*; do
            if [ ! -h "$f" ]; then continue 2; fi
            found=1
        done
        if [ x$found = x1 ]; then printf '%s\n' "$d"; fi
    done

这种方法的问题:

  • 不是tcsh
  • 它可能会被以点开头的文件所欺骗。

编辑:python

#!/usr/bin/env python

import os
import sys

for topdir in sys.argv:
    for root, dirs, files in os.walk(topdir):
        if not dirs and files:
            if all(os.path.islink(os.path.join(root, f)) for f in files):
                print os.path.join(root)

这种方法的问题:python可能无法安装。

相关内容