Nó không được chỉ định, nhưng đây là một giải pháp không có biểu thức chính quy nếu có ai quan tâm.
Chúng ta có thể sử dụng find . -type f
để chỉ nhận các tập tin, sau đó sử dụng dirname
và basename
viết điều kiện. Các tiện ích có hành vi sau:
$ find . -type f
./dir2/spam/spam.pdf
./dir2/dir2.tex
./dir3/dir3.pdf
./dir3/eggs/eggs.pdf
./dir1/dir1.pdf
./dir1/dir1.txt
basename
chỉ trả về tên tệp sau lần cuối /
:
$ for file in $(find . -type f); do basename $file; done
spam.pdf
dir2.tex
dir3.pdf
eggs.pdf
dir1.pdf
dir1.txt
dirname
đưa toàn bộ đường dẫn đến trận chung kết /
:
$ for file in $(find . -type f); do dirname $file; done
./dir2/spam
./dir2
./dir3
./dir3/eggs
./dir1
./dir1
Do đó, basename $(dirname $file)
đưa ra thư mục cha của tập tin.
$ for file in $(find . -type f); do basename $(dirname $file) ; done
spam
dir2
dir3
eggs
dir1
dir1
Giải pháp
Kết hợp những điều trên để tạo thành điều kiện "$(basename $file)" = "$(basename $(dirname $file))".pdf
, sau đó chỉ in từng kết quả find
nếu điều kiện đó trả về đúng.
$ 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
Trong ví dụ trên, chúng tôi đã thêm một thư mục / tệp có khoảng trắng trong tên để xử lý trường hợp đó (cảm ơn @Kusalananda trong các bình luận)