これは指定されていませんが、誰かが興味を持っている場合は、正規表現を使用しない解決策です。
私たちはfind . -type f
ファイルを取得するために使用でき、次に条件付きを利用dirname
しbasename
て書き込みます。ユーティリティの動作は次のとおりです。
$ find . -type f
./dir2/spam/spam.pdf
./dir2/dir2.tex
./dir3/dir3.pdf
./dir3/eggs/eggs.pdf
./dir1/dir1.pdf
./dir1/dir1.txt
basename
最後のファイル名だけを返します/
:
$ for file in $(find . -type f); do basename $file; done
spam.pdf
dir2.tex
dir3.pdf
eggs.pdf
dir1.pdf
dir1.txt
dirname
最終までの全体のパスを与える/
:
$ for file in $(find . -type f); do dirname $file; done
./dir2/spam
./dir2
./dir3
./dir3/eggs
./dir1
./dir1
したがって、basename $(dirname $file)
ファイルの親ディレクトリを提供します。
$ for file in $(find . -type f); do basename $(dirname $file) ; done
spam
dir2
dir3
eggs
dir1
dir1
解決
上記を組み合わせて条件付きを形成し、その条件がtrueを返す場合に"$(basename $file)" = "$(basename $(dirname $file))".pdf
のみ、各結果を出力しfind
ます。
$ while read file; do if [ "$(basename "$file")" = "$(basename "$(dirname "$file")")".pdf ]; then echo $file; fi done < <(find . -type f)
./dir2/spam/spam.pdf
./dir3/dir3.pdf
./dir3/eggs/eggs.pdf
./dir1/dir1.pdf
./Final Thesis/grits/grits.pdf
./Final Thesis/Final Thesis.pdf
上記の例では、そのケースを処理するために名前にスペースが含まれるディレクトリ/ファイルを追加しています(コメントの@Kusalanandaに感謝)