উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে ফাইলগুলি কীভাবে অনুসন্ধান করবেন


116

আমি XMLএকটি নির্দিষ্ট ডিরেক্টরিতে সমস্ত ফাইল এবং এর ভিতরে থাকা সমস্ত উপ-ডিরেক্টরি (পুনরাবৃত্তভাবে) সন্ধান করার চেষ্টা করছি ।

ls -R *.xmlকেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইল তালিকাভুক্ত করা হয়। আমি নিশ্চিত, সাব-ফোল্ডারগুলিতে নিজের কাছে বেশ কয়েকটি .xmlফাইল রয়েছে তবে কোনওটি প্রদর্শিত হচ্ছে না।

এটি কি একটি কনফিগারেশন সমস্যা?


2
আপনি করতে পারেনls -R | grep .xml
নিকোস

উত্তর:


90

Find ব্যবহার করে দেখুন

sudo find . -print | grep -i '.*[.]xml'

4
সুডো অবশ্যই আবশ্যক, বা এটি সুপার ব্যবহারকারীর সুবিধাদি নিশ্চিত করার জন্য আছে?
শামীম হাফিজ

4
আমি আপনাকে সিদ্ধান্ত নিতে দিন। সুডো , না সুডো
মিচ

6
মাত্র আগ্রহের বাইরে। findওভারের সুবিধা কী ls -R?
don.joey

1
@ don.joey এই সাহায্য করতে পারে stackoverflow.com/questions/13830036/...
মিচ

10
মিশ্রণের জন্য -1 findএবং grepকখন findরেজিক্স এবং গ্লোব উভয় ব্যবহার করে ফিল্টারিং করতে পারে এবং যখন মিশ্রণের দরকার হয় তখন findএর -print0এবং গ্রেপ ব্যবহার না করে -z
মুড়ু

147

আপনি এটি কেবল অনুসন্ধানের মাধ্যমে করতে পারেন :

find . -name '*.xml'

.বর্তমান ডিরেক্টরি। যদি আপনাকে অন্য ডিরেক্টরিতে অনুসন্ধান করতে .হয় তবে ডিরেক্টরিের পথটি প্রতিস্থাপন করুন ।


2
এটি বর্তমান ডিরেক্টরিতে মূলযুক্ত ডিরেক্টরিতে পুনরাবৃত্তভাবে প্রয়োজনীয় ফাইল অনুসন্ধান করে? আমার ক্ষেত্রে এটি কেবলমাত্র বর্তমান ডিরেক্টরিতে পরীক্ষা করেছে, সাব-ডিরেক্টরিটি চেক করে নি।
মোস্তাফিজ রহমান

1
@ মোস্তাফিজ, আপনাকে '* .xML' অংশটি উদ্ধৃত করতে হবে। আমি আমার উত্তর সম্পাদনা করব।
কেরুসিট

1
আসলে আমি .phpবর্তমান ডিরেক্টরিতে ফাইল অনুসন্ধান করেছি । তবে এটি কেবল .phpবর্তমান ডিরেক্টরিতে ফাইল ফিরেছে , উপ ডিরেক্টরিতে পুনরাবৃত্তভাবে অনুসন্ধান করে নি searched এই কারণেই আমি জিজ্ঞাসা করছি যে findকমান্ড পুনরাবৃত্তভাবে অনুসন্ধান করে কিনা ।
মোস্তাফিজ রহমান

3
@ মোস্তাফিজ, findকমান্ডটি পুনরাবৃত্তি অনুসন্ধান করে। আপনি যদি প্যারামিটারটি উদ্ধৃতি না করেন তবে আমি মনে করি আপনার শেলটি এর উপর একটি সম্প্রসারণ করতে পারে *, সুতরাং এটি বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলির সাথে মিলবে।
কেরুসিট

ঠিক আছে! আমি কিছু ভুল করেছি। এখন এটি পুরোপুরি কাজ করছে!
মোস্তাফিজ রহমান

13

এই আদেশটি ব্যবহার করে দেখুন:

ls -R | grep '.*[.]xml'

lsআউটপুট ফিল্টার করার বিকল্প নেই। তার জন্য আপনার পাইপ ব্যবহার করা দরকার। এই থেকে আউটপুট পাসের lsজন্য grep, যা তারপর তাদের শুধু দেখানোর জন্য ফিল্টার .xmlফাইল।


5
যাইহোক, ডিরেক্টরিটি এটি থেকে এসেছে তা প্রদর্শন করতে এটি পেতে?
অ্যাডমো

1
বাধ্যতামূলক লিঙ্ক: পার্স করবেন না কেন ? ls
রুসলান

4

সজোরে আঘাত

globstarশেল বিকল্প ব্যবহার করে , আমরা পুনরাবৃত্ত গ্লোববিং ব্যবহার করতে পারি./**/*

bash-4.3$ shopt -s globstar
bash-4.3$ for i in  ./**/*.xml; do printf "%s\n" "$i" ; done
./adwaita-timed.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml

পার্ল

পার্লের একটি মডিউল রয়েছে Find, যা পুনরাবৃত্ত ডিরেক্টরি ডিরেক্টরি ট্রি ট্রভারসালকে অনুমতি দেয়। বিশেষ find()ফাংশনটির মধ্যে আমরা একটি ওয়ান্টেড সাবরুটিন এবং যে ডিরেক্টরিটি আমরা অতিক্রম করতে চাই তার সংজ্ঞা দিতে পারি, উদাহরণস্বরূপ এটি .। এই ক্ষেত্রে ওয়ান লাইনারটি হ'ল:

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

পাইথন

যদিও পার্লের পুনরায় গাছের ট্র্যাভারসালকে উত্সর্গীকৃত পুরো মডিউল রয়েছে, পাইথনের একটি ঝরঝরে ফাংশন রয়েছে walk()যা osমডিউলের অংশ এবং বারবার শীর্ষস্থানীয় পথের সমস্ত অংশ, সমস্ত উপ-ডিরেক্টরিগুলির তালিকা এবং ফাইলের নামের তালিকা দেয়। আমরা নিম্নলিখিতগুলি করতে পারি:

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

এটি স্ক্রিপ্ট হিসাবে আরও সুস্পষ্ট হতে পারে:

#!/usr/bin/env python
import os,sys 
for r,s,f in os.walk("."): 
    for i in f: 
        if i.endswith(".xml") 
             print(os.path.join(r,i))

আবিষ্কার

অন্যান্য উত্তর findপুনরাবৃত্তিমূলক ট্র্যাভারসাল জন্য উল্লেখ করেছে, এবং এটি কাজের জন্য টু টু টুল। যেটি উল্লেখ করতে হবে তা হ'ল findএকাধিক কমান্ড লাইন সুইচ রয়েছে, যেমন -printfপছন্দসই বিন্যাসে আউটপুট প্রিন্ট করা, -type fকেবল নিয়মিত ফাইলগুলি -inumসন্ধান করা, ইনোড নম্বর দ্বারা -mtimeঅনুসন্ধান করা, পরিবর্তনের তারিখ দ্বারা অনুসন্ধান করা, -exec <command> {} \;ফাইল প্রক্রিয়া করার জন্য একটি নির্দিষ্ট কমান্ড কার্যকর করা আর্গুমেন্ট হিসাবে ফাইলটি পাস করার সাথে (যেখানে বর্তমান ফাইলের জন্য {}স্ট্যান্ডার্ড findপ্লেসোল্ডার রয়েছে) এবং আরও অনেকে তাই দয়া করে ম্যানপেজটি পড়ুন find

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