ディレクトリ内のディレクトリのみを検索し、リンクされたディレクトリとそのリンクを除外する必要があります。

ディレクトリ内のディレクトリのみを検索し、リンクされたディレクトリとそのリンクを除外する必要があります。

私はルートディレクトリにあり、そこにいくつかのフォルダがあります。

0.1
0.2
0.3
0.4
0.5
0.6
shortcut -> 0.6

0.6フォルダだけでなく、ショートカットなしで上記のディレクトリを一覧表示する必要があります。この場所の上やフォルダ内では検索しません。ここでもいくつかのファイルがあるかもしれませんが、無視する必要があります。同じ命名規則を持つ新しいフォルダが時々このディレクトリに追加されるため、この検索はbashスクリプトに含まれ、新しいフォルダを追加してスクリプトを実行すると他の結果が生成されます。

頑張ってたけどfind -P . -maxdepth 1 -type d -ls運がなかった。

答え1

シンボリックリンクを見つけて追跡する以外に、シンボリックリンクのターゲット名が何であるかを知る方法はありません。

したがって、次のようにすることができます(bashバージョン4.0以降を想定)。

#!/bin/bash

# Our blacklist and whitelist associative arrays (whitelist is a misnomer, I know)
# blacklist: keyed on confirmed targets of symbolic links
# whitelist: keyed on filenames that are not symbolic links
#            nor (yet) confirmed targets of symbolic links

declare -A blacklist whitelist

for name in *; do
    if [ -L "$name" ]; then

        # this is a symbolic link, get its target, add it to blacklist
        target=$(readlink "$name")
        blacklist[$target]=1

        # flag target of link in whitelist if it's there
        whitelist[$target]=0

    elif [ -z "${blacklist[$name]}" ]; then
        # This is not a symbolic link, and it's not in the blacklist,
        # add it to the whitelist.
        whitelist[$name]=1
    fi
done

# whitelist now has keys that are filenames that are not symbolic
# links. If a value is zero, it's on the blacklist as a target of a
# symbolic link.  Print the keys that are associated with non-zeros.
for name in "${!whitelist[@]}"; do
    if [ "${whitelist[$name]}" -ne 0 ]; then
        printf '%s\n' "$name"
    fi
done

スクリプトは、ユーザーのディレクトリを現在の作業ディレクトリとして使用して実行する必要があり、そのディレクトリの名前を想定してはいけません。

答え2

あらゆる種類のファイルが必要な場合目次shortcut次のシンボリックリンクの対象ではありませんzsh

#! /bin/zsh -
printf '%s\n' *(/^e'{[[ $REPLY -ef shortcut ]]}')
  • (...):glob修飾子は、名前以外の基準に従ってファイルをさらにフィルタリングします。
  • /:このタイプのファイルのみ目次
  • ^: 次のグローバル修飾子を無効にします。
  • e'{shell code}':評価結果(終了状態)に応じてファイルshell code(検討中のファイルがある場所$REPLY)を選択します。
  • [[ x -ef y ]]xy:同じファイルを指す場合はtrueを返します(シンボリックリンクの確認後)。通常、2つのファイルのデバイス番号とinode番号(シンボリックリンクを解決するシステムコールを介して取得)を比較してstat()これを行います。

GNUの使用find(ソートされていないリスト、プレフィックス付きのファイル名./):

#! /bin/sh -
find -L . ! -name . -prune -xtype d ! -samefile shortcut
  • -L:シンボリックリンクの場合、シンボリックリンクの宛先が考慮されます。これは-samefile上記と同じことを行うために必要です。zsh-ef
  • ! -name . -prune:トリム.。同じ -mindepth 1 -maxdepth 1ですが、より短く標準です。
  • -xtype d:シンボリックリンクを確認する前に、元のファイルの種類を一致させる必要が-Lあります。-xtype
  • -samefile shortcutshortcut:ファイルが次の場合は-Ltrueです(symlinkを使用して解釈した後)。

宛先ディレクトリを除くすべてのディレクトリの一覧表示どの現在のディレクトリのシンボリックリンク:

#! /bin/zsh -
zmodload zsh/stat
typeset -A ignore
for f (*(N@-/)) {
   zstat -H s -- $f &&
     ignore[$s[device]:$s[inode]]=1
}

printf '%s\n' *(/^e'{zstat -H s -- $REPLY && ((ignore[$s[device]:$s[inode]]))}')

-bases はzsh隠しファイルを無視します。Dglob修飾子を追加するか、dotglobオプションを設定してこれを検討してください。

答え3

ディレクトリを除外するには、クリーンアップスイッチを試してください。それから質問に対する答えが出てきます。

find . -path ./your-folder -prune -o -maxdepth 1 -type d -print

関連情報