심볼릭 링크만 포함하는 계층 구조의 디렉터리 목록 가져오기

심볼릭 링크만 포함하는 계층 구조의 디렉터리 목록 가져오기

심볼릭 링크만 포함된 계층 구조의 디렉터리 목록을 가져오는 데 사용할 수 있는 다양한 도구가 있다는 것을 알고 있지만 솔루션을 직접 만들 만큼 기술이 부족합니다.

개인적으로 이 작업을 수행하려면 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

sh한 가지 방법은 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설치가 불가능할 수 있습니다.

관련 정보