次の問題があります:
ディレクトリExample1
には3つのファイルがあります:Example1
、Things
およびPictures
。
ディレクトリExample2
には3つのファイルがあります:Example2
、Example3
およびPictures
。
ディレクトリ名に一致するファイルのみを表示するリストが必要です。これはExample1
およびExample2
。私はdiff、find、locate、lsを試してみましたが、何も達成していません。
通常、ディレクトリはファイルよりも少ないので、すべてのディレクトリを探して、必要なファイル名が含まれているかどうかをテストします。
_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
_テストに変更します。
後方参照を使用して、格納ディレクトリと同じ名前のファイル名を正規表現と簡単に照合できます。これらは、_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