Получить список каталогов в иерархии, которые содержат только символические ссылки

Я знаю о различных инструментах, доступных для получения списка каталогов в иерархии, которые содержат только символические ссылки, но я недостаточно опытен, чтобы изобрести решение самостоятельно.

Лично мне для этого придется использовать tcsh.

Другая проблема, с которой я столкнулся, заключается в том, как сделать то же самое, но только перечислить каталоги, содержащие хотя бы одну символическую ссылку и хотя бы один другой файл.

0
21.09.2017, 22:55
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может не установиться.

1
28.01.2020, 02:33

каталоги, содержащие только символические ссылки, останутся в дереве каталогов, как если бы они не содержали каталоги и, следовательно, не -символические ссылки.

В 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
1
28.01.2020, 02:33

Теги

Похожие вопросы