web-dev-qa-db-ja.com

サブディレクトリを含まないディレクトリを見つける

スクリプトはkshです。現在のディレクトリの直下にある、サブディレクトリではなくファイルのみを含むすべてのディレクトリ名を検索する必要があります。

ls -alRそして、最初のフィールドの最初の文字の出力を再帰的に解析します(ディレクトリの場合はd)。 awkが解析と検索に最適な方法だと思います。

たとえば、単純なls -al現在のディレクトリに出力:

   drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
   drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
   -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
   drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
   drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
   -rw-------   1 af      staff      3 17 Mar 16:37 textd
   …

この出力には、PublicSitesの2つのディレクトリがあります。ディレクトリPublicにはサブディレクトリが含まれていませんが、Sitesには含まれています。 Sitesには3つのサブディレクトリがあります。したがって、ディレクトリを含まないディレクトリのみをエコーする必要があります。私の場合、これはSitesだけです。

10
Nat Kup

awkを使用する必要はまったくありません。 kshが提供する組み込みテストを使用します。たとえば、次のようにします。

#!/bin/ksh

for NAME in *
do
    FOUND=no
    if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
    then
        for SUBNAME in $NAME/*
        do
            if [[ -d $SUBNAME ]]
            then
                FOUND=yes
                break
            fi
        done
        if [[ $FOUND == no ]]
        then
            echo Found only files in $NAME
        fi
    fi
done

この小さなスクリプトは、現在のディレクトリ内のすべてのディレクトリを調べ、サブディレクトリではなくファイルのみが含まれているかどうかを通知します。

1
Bruce Ediger

findを使用でき、「通常のUnixファイルシステム」で作業している場合(つまり、 find(1) で定義されている- -noleafオプションの説明)の場合、次のコマンドを使用できます。

_find . -type d -links 2
_

各ディレクトリには少なくとも2つの名前(ハードリンク)があります:_._とその名前。そのサブディレクトリは、存在する場合、親ディレクトリを指す_.._を持つため、Nサブディレクトリを持つディレクトリには、N + 2に等しいハードリンクカウントがあります。したがって、ハードリンクカウントが2のディレクトリを検索すると、サブディレクトリがN = 0のディレクトリが検索されます。

したがって、findを使用できる場合、これはおそらく最速の方法であり、各メンバーのディレクトリの内容をstat()でシェル内ループよりも明らかに優れています。

14
intelfx

_*/_は、現在のディレクトリのサブディレクトリに一致します。これには、ディレクトリへのシンボリックリンクも含まれます。

Ksh93では、パターンの先頭に~(N)を追加すると、一致がない場合は空のリストに展開されます。これがないと、一致がない場合、パターンは変更されません。

次のksh93関数は、サブディレクトリやディレクトリへのリンクを含まない現在のディレクトリのサブディレクトリをリストします。

_list_leaf_directories () {
  local FIGNORE='.?(.)'        # don't ignore dot files
  local d
  for d in */; do
    [[ -L $d ]] || continue;   # skip symbolic links
    set -- ~(N)"$d"/*/
    if ((!$#)); then echo "$d"; fi
  done
done
_

私があなたを誤解していないのであれば、サブディレクトリではなくディレクトリでファイルを見つけたいだけです。これがあなたの意図である場合、ここに解決策があります

find . -type f

通常のファイル(ブロックデバイスファイル、キャラクターデバイスファイルなど)以外を検索する場合は、findコマンドのマニュアルページを参照し、そのページでtypeキーワードを探します。通常のファイルやディレクトリなど、さまざまなファイルタイプが表示されます。

これがあなたが探しているものであることを願っています

0
MelBurslan