シンボリックリンクのみを含む階層のディレクトリリストを取得する

シンボリックリンクのみを含む階層のディレクトリリストを取得する

シンボリックリンクのみを含む階層のディレクトリのリストを取得するために使用できるさまざまなツールがあることはわかっていますが、ソリューションを自分で作成するのに十分な技術がありません。

個人的にこれを行うには、tcshを使用する必要があります。

私が持っているもう1つの問題は、同じことを行いますが、少なくとも1つのシンボリックリンクと少なくとも1つの他のファイルを含むディレクトリのみを一覧表示する方法です。

答え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

少なくとも1つのシンボリックリンクと1つの非記号リンクを持つディレクトリの場合は、各ディレクトリを確認する必要があります。

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

答え2

sh1つの方法はGNUを使用し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があります。

関連情報