web-dev-qa-db-ja.com

ディレクトリと同じ名前のファイルを検索します

次の問題があります:

ディレクトリExample1には3つのファイルがあります:Example1ThingsおよびPictures

ディレクトリExample2には3つのファイルがあります:Example2Example3およびPictures

ディレクトリ名に一致するファイルのみを表示するリストが必要です。これはExample1およびExample2。私はdiff、find、locate、lsを試してみましたが、何も達成していません。

5
ChangKo

通常、ディレクトリはファイルよりも少ないので、すべてのディレクトリを探して、必要なファイル名が含まれているかどうかをテストします。

_find . -type d -exec sh -c '
    for dirpath do
        filepath="$dirpath/${dirpath##*/}"
        [ -f "$filepath" ] && printf "%s\n" "$filepath"
    done' sh {} +
_

これにより、ファイルと同じ名前のディレクトリにあるすべての通常ファイル(および通常ファイルへのシンボリックリンク)のパス名が出力されます。

テストは、短いインライン_sh -c_スクリプトで実行され、引数として多数のディレクトリパス名を取得します。各ディレクトリパス名を反復処理し、探している名前でファイルパス名を作成します。コード内の_${dirpath##*/}_は、$(basename "$dirpath")で置き換えることができます。

与えられた例のディレクトリ構造では、これは出力されます

_./Example1/Example1
./Example2/Example2
_

通常のファイルだけでなくany nameだけをテストするには、_-f_テストを_-e_テストに変更します。

8
Kusalananda

後方参照を使用して、格納ディレクトリと同じ名前のファイル名を正規表現と簡単に照合できます。これらは、_what/ever/something/something_という形式のファイル名で、2つのsomething部分は同一で、スラッシュを含みません。 BRE正規表現構文では、_[^/]*_はスラッシュを含まない任意の文字列に一致し、\(/[^/]*\)はスラッシュの後に任意の数の非スラッシュ文字が続き、全体をグループにして、_\1_は、最初のグループと一致する同じテキストと一致するため、\(/[^/]*\)\1は、同じ名前の2つのパスセグメントと一致します。以前のディレクトリコンポーネントと一致するように、最初に_.*_を追加します。

GNU find、FreeBSD find、macOS find、または_-regex_をサポートするその他のfindを使用:

_find . -regex '.*\(/[^/]*\)\1'
_

find -exec:を使用

find . -type f \
  -exec sh -c '[ "$(basename "$1")" = "$(basename "$(dirname "$1")")" ]' find-sh {} \; \
  -print

-printは、[ ... ]内の-exec sh -c '...'の結果がtrueの場合にのみ実行されます。

出力:

./Example1/Example1
./Example2/Example2
5
pLumo