এটি সন্ধানের চেয়ে গ্লোববিংয়ের সাথে সমাধান করা অনেক সুন্দর।
$ cd ... # to the directory one level above the album/artist structure
$ echo */*/*.cover # lists all the covers
$ printf "%s\n" */*/*.cover # lists all the covers, one per line
এখন ধরুন এই সুন্দর কাঠামোতে আপনার কাছে কোনও স্ট্রে ফাইল নেই। বর্তমান ডিরেক্টরিতে কেবল শিল্পী উপ-ডিরেক্টরি রয়েছে এবং সেগুলিতে কেবল অ্যালবামের উপ-ডিরেক্টরি থাকে। তারপরে আমরা এরকম কিছু করতে পারি:
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
<(...)
সিনট্যাক্স ব্যাশ প্রক্রিয়া প্রতিকল্পন: এটি আপনি একটি ফাইল যুক্তি স্থানে কমান্ড ব্যবহার করতে দেয়। এটি আপনাকে একটি কমান্ডের আউটপুটটিকে ফাইল হিসাবে বিবেচনা করতে দেয়। সুতরাং আমরা দুটি প্রোগ্রাম চালাতে পারি এবং অস্থায়ী ফাইলগুলিতে তাদের আউটপুট সংরক্ষণ না করে তাদের ডিফ নিতে পারি। diff
প্রোগ্রামটি ভাবে যে দুই ফাইলগুলির সাথে কাজ করা হয়, কিন্তু এটি আসলে দুই পাইপ থেকে পড়া হচ্ছে।
কমান্ড যে ডান হাত ইনপুট উৎপন্ন diff
, printf "%s\n" */*
শুধু অ্যালবাম ডিরেক্টরি তালিকাবদ্ধ করে। বাম হাতের কমান্ডটি *.cover
পাথগুলি দিয়ে পুনরাবৃত্তি করে এবং তাদের ডিরেক্টরিগুলির নাম মুদ্রণ করে।
পরীক্ষা রান:
$ find . # let's see what we have here
.
./a
./a/b
./foo
./foo/bar
./foo/baz
./foo/baz/cover.jpg
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
0a1,2
> a/b
> foo/bar
আহা, a/b
এবং foo/bar
ডিরেক্টরিগুলির কোনও নেই cover.jpg
।
কিছু ভাঙা কোণার কেস রয়েছে যেমন ডিফল্টরূপে *
নিজের কাছে প্রসারিত হয় যদি এটি কিছু না মেলে। এটি বাশের সাথে সম্বোধন করা যেতে পারে set -o nullglob
।