它没有指定,但是如果有人感兴趣,这里是不带正则表达式的解决方案。
我们可以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
解
结合以上内容形成条件"$(basename $file)" = "$(basename $(dirname $file))".pdf
,然后仅find
在条件返回true 时才打印每个结果。
$ 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)