কীভাবে সাবডিয়ারগুলিতে ফাইলগুলি সন্ধান করবেন এবং ফাইলগুলি একটি একক আদেশে বাছাই করবেন?


9

ব্যবহার করে একটি সাধারণ অনুসন্ধানের ফলাফল find . ! -path "./build*" -name "*.txt":

./tool/001-sub.txt
./tool/000-main.txt
./zo/001-int.txt
./zo/id/002-and.txt
./as/002-mod.txt

এবং এর সাথে বাছাই করার সময় sort -n:

./as/002-mod.txt
./tool/000-main.txt
./tool/001-sub.txt
./zo/001-int.txt
./zo/id/002-and.txt

তবে কাঙ্ক্ষিত আউটপুটটি হ'ল:

./tool/000-main.txt
./zo/001-int.txt
./tool/001-sub.txt
./zo/id/002-and.txt
./as/002-mod.txt

যার অর্থ আউটপুট কেবল ফাইলের উপর ভিত্তি করে সাজানো হয় তবে ফোল্ডারের তথ্য আউটপুট অংশ হিসাবে বজায় রাখা উচিত।

সম্পাদনা : উদাহরণটিকে আরও জটিল করুন কারণ উপ-ডিরেক্টরি কাঠামোতে একাধিক স্তর অন্তর্ভুক্ত থাকতে পারে।


2
: এই প্রশ্ন আমি তাই জিজ্ঞাসা দেখুন stackoverflow.com/questions/3222810/...
camh

@ ক্যামহ - সম্ভব হলে আমি কেবল ইউনিক্স কমান্ড ব্যবহার করতে চাই। যাই হোক না কেন আমার প্রশ্নটি আপনার একটি সদৃশ। আপনি কি এই থ্রেডের সর্বোত্তম সমাধানটি স্থানান্তর করতে পারেন (যাইহোক মূলটিতে একটি লিঙ্ক রাখুন) যাতে আমি সমাধান হিসাবে চিহ্নিত করতে পারি?
আনোড করুন

যদি @ শ্যাশন আমার মন্তব্যে প্রস্তাবিত পরিবর্তনগুলি করে ( -printfপরিবর্তে ব্যবহার করুন awk), আমি মনে করি এটিই সেরা সমাধান। আমি এই পদ্ধতিটি ব্যবহার করতে আমার আসল বাস্তবায়নটি পুনরায় কাজ করেছি।
ক্যাম

উত্তর:


9

আপনাকে শেষ ক্ষেত্র অনুসারে বাছাই করতে হবে ( /ফিল্ড বিভাজক হিসাবে বিবেচনা করে )। দুর্ভাগ্যক্রমে, আমি এমন একটি সরঞ্জামের কথা ভাবতে পারি না যা এই ক্ষেত্রগুলির সংখ্যা পরিবর্তিত হলে (এটি যদি কেবল sort -kনেতিবাচক মান নিতে পারে) করতে পারে।

এটি ঘুরে দেখার জন্য, আপনাকে একটি সাজসজ্জা-সাজানোর-আনকোটোরটি করতে হবে। অর্থাৎ ফাইলের নামটি ধরুন এবং প্রথমে ফিল্ড বিভাজকের পরে এটি স্থাপন করুন, তারপরে একটি বাছাই করুন, তারপরে প্রথম কলাম এবং ফিল্ড বিভাজকটি সরান।

find . ! -path "./build*" -name "*.txt" |\
    awk -vFS=/ -vOFS=/ '{ print $NF,$0 }' |\
    sort -n -t / |\
    cut -f2- -d/

এই awkকমান্ডটি বলছে যে ফিল্ড বিভাজক FS সেট করা আছে /; এটি ক্ষেত্রগুলি পড়ার পদ্ধতিটিকে প্রভাবিত করে। আউটপুট ক্ষেত্র বিভাজক OFS এছাড়াও সেট করা হয় /; এটি যেভাবে এটি রেকর্ডগুলি মুদ্রণ করে তাতে প্রভাব ফেলে। পরবর্তী বিবৃতিতে বলা হয়েছে যে সর্বশেষ কলামটি মুদ্রণ করুন ( NFএটি রেকর্ডের ক্ষেত্রের সংখ্যা, সুতরাং এটি সর্বশেষ ক্ষেত্রের সূচি হিসাবেও ঘটে) পাশাপাশি পুরো রেকর্ড ( $0পুরো রেকর্ডটি হয়); এটি তাদের মধ্যে ওএফএস দিয়ে তাদের মুদ্রণ করবে। তারপরে তালিকাটি ক্ষেত্র বিভাজক হিসাবে sortবিবেচনা করে সম্পাদনা /করা হচ্ছে - যেহেতু রেকর্ডে আমাদের ফাইলের নামটি প্রথম রয়েছে তাই এটি এটি অনুসারে বাছাই করবে। তারপরে cutপ্রিন্টগুলি কেবল 2 টি /ক্ষেত্রটি প্রান্তকে শেষ করে আবার ক্ষেত্র বিভাজক হিসাবে বিবেচনা করে।


3
যেহেতু এই খোঁজ (1) সঙ্গে হয়, তাহলে আপনি awk অংশ এবং ব্যবহার এড়িয়ে যেতে পারেন-printf '%f/%p\n'
camh

প্রকৃতপক্ষে আমাদের সেটআপটি কিছুটা জটিল। এটিতে ভেরিয়েবল সাবডির গভীরতা রয়েছে। এই সত্যটি প্রতিফলিত করতে প্রশ্ন সম্পাদনা করেছে। প্রথমে এটি অন্তর্ভুক্ত না করার জন্য আমার ক্ষমা চাই।
আনোডে আনড করুন

1
@ ইউনোড: শানের সমাধানটি ভেরিয়েবলের গভীরতা পরিচালনা করে, এটি এই সমস্যাটির মূল সমস্যা (সামান্য ভিন্নতা পর্যন্ত)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

4

নাম এবং পাথ আউটপুট, নাম অনুসারে বাছাই করা এবং শেষ ধাপে নামটি কাটআফ করার জন্য আমি ফাইলগুলি '-প্রিন্টফ' ব্যবহার করব। '###' কাটাতে সহায়তা করার জন্য কেবল একটি চিহ্নিতকারী।

find -name "*.txt" -printf "%f###%p\n" | sort -n | sed 's/.*###//'

% f ফাইলের নাম মুদ্রণ করে,% পি পুরো পথ।

এটিকে এক লাইনে আনার জন্য আমি ফাইন্ড-কমান্ডকে সরল করে দিয়েছিলাম, অবশ্যই আপনি এই ! -path "./build*"অংশটি ছেড়ে চলে যাবেন ।


3

Zsh ≥4.3.10 এ:

print -l -- **/*.txt~build*(oe\''REPLY=${REPLY:t}'\')
  • **/*.txt*.txtবর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলিতে পুনরাবৃত্তভাবে মিলছে ।
  • ~build* পাঠ্যগুলি build*(যেমন ! -path './build*') দিয়ে শুরু হওয়া ম্যাচগুলি বাদ দেয় । (আপনার setopt extended_globপ্রথম দরকার ।)
  • (oe\''…'\')একটি বাছাই গ্লোব যোগ্যতাREPLY=…স্ট্রিং থেকে ফেরতের জন্য সাজানোর জন্য স্ট্রিংটি তৈরি করে।
  • ${REPLY:t}হয় basename পথের ( "লেজ")।

প্রচুর পরিমাণে জাদু। আকর্ষণীয় তবে আমরা শি সিনট্যাক্সের মধ্যে সীমাবদ্ধ। +1
আনোডে আনোড করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.