यह निर्दिष्ट नहीं किया गया था, लेकिन यहां नियमित अभिव्यक्ति के बिना एक समाधान है यदि कोई दिलचस्पी है।
हम 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
यदि वह शर्त सही है।
$ 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
उपरोक्त उदाहरण में, हमने उस मामले का इलाज करने के लिए नाम में रिक्त स्थान के साथ एक निर्देशिका / फ़ाइल जोड़ी है (टिप्पणियों में @ कुसलानंद के लिए धन्यवाद)