ফোল্ডারের তুলনা


10

আমার অনুরূপ সাবফোল্ডার স্ট্রাকচার সহ দুটি ফোল্ডার রয়েছে, যা আমি তুলনা করতে চাই। উদাহরণ স্বরূপ:

A 
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5

এবং

B 
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text

আমি সেই সমস্ত সাবফোল্ডারগুলিকে তালিকাবদ্ধ করতে চাই Aযা থেকে সাবফোল্ডারের জন্য উপসর্গ রয়েছে Bএবং সেই সাথে সংশ্লিষ্ট সাবফোল্ডারগুলিকেও তালিকাবদ্ধ করতে চাই B। প্রত্যাশিত আউটপুট হয়

child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing

একটি গৌণ প্রয়োজনীয়তা: যদি একাধিক মিল থাকে Bতবে এটির একটি ত্রুটি / সতর্কতা দেওয়া উচিত।

আমার সমাধান :

cd A
for f in `ls -d */`; 
do
    cd B;
    new_dirs=(`ls -1d $f*`);
    cd -;
    if [ ${#new_dirs[@]} -eq 0 ]
    then
        ## DO_Nothing
        continue;
    elif  [ ${#new_dirs[@]} -gt 1 ]
    then
        echo "Multiple matches to $f";
        continue;
    else
        echo "Unique Match found to $f -- ${new_dirs[0]}";
        continue;
    fi;    
done

সমস্যা:

সেই মানগুলির জন্য $f, যার কোনও সংশ্লিষ্ট সাবফোল্ডার নেই B, অ্যারে নির্মাণ আমাকে ত্রুটি দিচ্ছে। উদাহরণ:

ls: 'চাইল্ড -4 *' অ্যাক্সেস করতে পারে না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

প্রশ্ন

  • কীভাবে এই ত্রুটিগুলি থেকে মুক্তি পাবেন?
  • আমার কোডটিতে লক্ষ্য (গুলি) অর্জনের কি আরও ভাল উপায় আছে?

আগাম ধন্যবাদ!


4
প্রায় কার্যক্ষম সমাধান সরবরাহের জন্য +1!
ব্যবহারকারী5325

এটি আপনার নির্দিষ্ট প্রশ্নের উত্তর নয়, তবে আপনি diff -rq DIR1 DIR2কেবল ডিরেক্টরি কাঠামো নয়, ফাইলের বিষয়বস্তুগুলির তুলনা করতে ব্যবহার করতে পারেন ।
jrw32982 18:32

উত্তর:


10

আরও ভাল উপায়

বিশ্লেষণ করবেন নাls ; পরিবর্তে গ্লোব ব্যবহার করুন। বাস্তবে আপনি ইতিমধ্যে গ্লোব ব্যবহার করছেন, কেবল এগুলি মুড়িয়ে রাখুন ls, যা অর্থহীন। nullglobকোনও মিল নেই যখন আপনার কেবল চালু করা দরকার ।

এছাড়াও cdসহজ জিনিস এড়ানো ।

#!/bin/bash

shopt -s nullglob

dir1=A
dir2=B

for dir in "$dir1"/*/; do
    basename="$(basename -- "$dir")"
    dirs_match=( "$dir2/$basename"*/ )
    case ${#dirs_match[@]} in
    0)
        ;;
    1)
        echo "Unique match for $dir: ${dirs_match[*]}"
        ;;
    *)
        echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
        ;;
    esac
done

আউটপুট:

Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/

আমি B/child-3-somethingগৌণ প্রয়োজন পরীক্ষা করতে যোগ । এটি পরীক্ষার জন্য ডিরেক্টরি কাঠামো তৈরি করে:

mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}

যাইহোক, শেল স্ক্রিপ্টগুলিতে সমস্যা খুঁজতে শেলচেক খুব দরকারী very


ShellCheck.net আকর্ষণীয়, আপনি কি জানেন যে এটি নিজের সার্ভারগুলিতে সমস্ত কিছু আপলোড করে, বা স্থানীয়ভাবে এটি সমস্ত করা হয়? প্রবেশ করা তথ্যের গোপনীয়তা সম্পর্কে কেবল ভাবছি। [ shellcheckপ্যাকেজ ইনস্টল করা সবচেয়ে সুরক্ষিত হবে]
Xen2050

@ Xen2050 সাইটে থাকা অবস্থায় আমার ইন্টারনেটটি টগল করার চেষ্টা করেছিল এবং এটি আপলোড বলে মনে হচ্ছে। আমি কল্পনা করব এটি এটি রাখে না, তবে নিশ্চিত নয়। এবং হ্যাঁ প্যাকেজটি ভাল; আমি এটি ব্যবহার করে এমন একটি অ্যাটম প্লাগইন ব্যবহার করি।
wjandrea

পরামর্শের জন্য ধন্যবাদ। এবং দিকে নির্দেশ করার জন্য অনেক ধন্যবাদ ShellCheck। আমি সেই অংশটি পছন্দ করেছিলাম যেখানে এটি আপনাকে কেবল আপনার ত্রুটিগুলিই বলে না, বরং পরামর্শও দেয়! @ Xen2050, আপলোড অংশ সম্পর্কে, আমি স্রেফ নেটওয়ার্কটি shellcheckব্যবহার করে ইনস্টল করেছি aptএবং তারপরে অক্ষম নেটওয়ার্ক। মনে হচ্ছে এটি ইন্টারনেট ছাড়াই কাজ করছে ।
মাইক ভিডিসি

2

lsঅস্তিত্বহীন ফোল্ডারে কল করার ফলে আপনি যে ত্রুটি বার্তাটি পেয়েছিলেন তা ছুঁড়ে দেয়। সহজ উপায় হ'ল এটির সাথে আপনার স্ক্রিপ্টের লাইন 5 টি প্রতিস্থাপন করে : new_dirs=(`ls -1d $f* 2> /dev/null`);.


আপনি কি এটি পরীক্ষা করেছেন? স্টার্ডার ডিফল্টরূপে অবহেলিত বলে মনে হয়, যখন আমি চালনা করি t=(`echo ok; echo err 1>&2`)(বা ${t[@]}) কেবল ঠিক থাকে, টার্মিনালে ত্রুটি দেখা যায় তবে যাইহোক সংরক্ষণ করা যায় না। বা আমার পরীক্ষা সম্পর্কে মজার কিছু আছে?
Xen2050
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.