সেই ফাইলের ডিরেক্টরিতে আমি কীভাবে `find` ব্যবহার করব


11

আমি একটি ফাইল সন্ধান করতে চাই এবং তারপরে এটিতে থাকা ডিরেক্টরিটি লিখি। আমি চেষ্টা করেছি find /media/storage -name "Fedora" | xargs cdতবে অবশ্যই আমি is not a directoryত্রুটি করেছি।

আমি ওয়ান লাইন কমান্ড দিয়ে এর প্যারেন্ট ডিরেক্টরিটি কীভাবে প্রবেশ করব?


1
এবং যদি একাধিক অবস্থান থেকে একাধিক ফাইল থাকে?
সের্গেই কোলোডিয়াজনি

ফেডোরা * .আইসো ফাইলটি অনুসন্ধান করার জন্য @ সার্জ আইএম এবং আমি জানি যে কেবলমাত্র একটি আছে। যদি আরও কিছু থাকে তবে এটি প্রথম নির্দেশিকায় প্রবেশ করবে, আমার ধারণা
টি

বাশ দিয়ে shopt -s globstarআপনি করতে পারেন cd /media/storage/**/Fedora, তবে এটি প্রথম ম্যাচে গ্লোবকে মূল্যায়ন করা থামিয়ে দেয় না (সুতরাং এটি স্টিল্ড্রাইভারের সমাধানের চেয়ে ধীর গতির inte ইন্টারেক্টিভ ব্যবহারের জন্য, আমি সাধারণত যা করতাম তা হ'ল মাউসের কাছে পৌঁছানো এবং ডিরেক্টরিটির নাম অনুলিপি / পেস্ট করা, (এবং Alt + ব্যাকস্পেসটি আমি চাই না এমন পথের উপাদানগুলি ছিনিয়ে নেওয়ার প্রয়োজন হিসাবে) তবে আপনি যদি এটি অনেক কিছু করেন তবে আমার ধারণা শেল ফাংশনটি
পিটার কর্ডেস

1
বিটিডাব্লু, xargs cdসম্ভবত কাজ করতে পারে না। cdএটি কেবল শেল বিল্টিন হিসাবে কাজ করতে পারে, কারণ এটি নিজেই শেলের প্রসঙ্গটি পরিবর্তন করতে হয়। কোনও xargsশিশু প্রক্রিয়া এটি করতে পারে এমন কোনও উপায় নেই । আইডি কে যদি আপনি "অবশ্যই" বলতে চেয়েছিলেন, বা যদি findপ্রিন্ট করে যে পথটিতে শূন্যস্থান রয়েছে, যা আপনি ব্যবহার করেন নি -d \nবা কোনও কিছু না হওয়ায় এক্সার্গেস দ্বারা বিভক্ত । বা find -exec {} \;
পিটার কর্ডেস

দ্রষ্টব্য: আপনি cdযে মত চালাতে পারবেন না । cdএটি হ'ল বাশ, যদি cdআলাদা কমান্ড থাকত, তবে এটি (নিজস্ব) দির পরিবর্তন হত এবং তারপরে (আপনাকে শেলের কাছে ফিরিয়ে দেওয়া হবে, যা পূর্বের মতো একই অবস্থায় রয়েছে, দির কোনও পরিবর্তন হয়নি)।
ctrl-alt-delor

উত্তর:


14

কমপক্ষে আপনার যদি জিএনইউ থাকে তবে আপনি ডিরেক্টরিটি পেতে findব্যবহার করতে পারেন-printf '%h'

       %h     Leading directories of file's name (all but the last ele‐
              ment).  If the file name contains no slashes (since it is
              in  the  current  directory)  the %h specifier expands to
              ".".

সুতরাং আপনি সম্ভবত করতে পারে

cd "$(find /media/storage -name "Fedora" -printf '%h' -quit)"

-quitএকাধিক আর্গুমেন্ট বাধা দিতে পারে cdযদি একটির বেশি ফাইল ম্যাচ হবে।


1
-quitঅগত্যা সমর্থিত হয় না। নেটবিএসডি-তে এটি বলা হয়েছে -exit, unix.stackexchange.com/a/62883/117599 দেখুন
পিএইচকে

2
প্রিন্টফ না থাকলে আপনি কি এর পরিবর্তে এক্সেক্স ডাইরনাম করতে পারবেন?
গাই

@ গুয় ভাল ধারণা হ্যাঁ এটি খুব কার্যকর হওয়া উচিত বলে মনে হচ্ছে
স্টিল্ড্রাইভার

6

স্টিল্ড্রাইভারের সমাধানের মতো তবে এর সাথে সংমিশ্রণে-execdir (যদি আপনার findএটি সমর্থন করে তবে জিএনইউ বা ফ্রিবিএসডি এর মতো find) ব্যবহার করুন pwd:

cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"

-quitকেবলমাত্র একক ফলাফল এবং সম্পূর্ণ ডিরেক্টরি ক্রলিংয়ের ক্ষেত্রে কোনও সমস্যা নেই এমন ক্ষেত্রে isচ্ছিক। নেটবিএসডি- -exitতে এটি এবং ওপেনবিএসডি-তে বিদ্যমান নেই।


এবং কি \;জন্য?
হ্রভোয়ে টি

1
@ হ্রোভয়েট ঠিক যেমন -execএটি findআদেশটি কার্যকর করার জন্য পরামিতিগুলির সমাপ্তি সম্পর্কে বলে । তবে যেহেতু আমরা pwdএখানে প্যারামিটার ছাড়াই কল করতে চাই , আমরা এর \;পরে ডানটি রেখেছি।
পিএইচকে

findএক্সেকিডিরকে সমর্থন করে এমন কোনও বাস্তবায়ন রয়েছে -printf %hকি না ? আমার কাছে অসম্ভব বলে মনে হচ্ছে। দুর্ভাগ্যক্রমে
পিটার

1
@ পিটারকর্ডস ফ্রিবিএসডি এর find: freebsd.org/cgi/man.cgi?find%281%29 ( সবেমাত্র এটি একটি ফ্রিবিএসডি 11 ইনস্টলেশন-তে নিশ্চিত করেছেন)
পিএইচকে

নেটবিএসডি এর জন্য @ পিটারকর্ডস সম একই (নেটবিএসডি.ইউ.কম.বিন / ম্যান-সিজি?ফাইন্ড ++ নেটবিএসডি- বর্তমান ) এবং ওপেনবিএসডি ( man.openbsd.org/OpenBSD-current/man1/find.1 )। ল্যাটার যদিও -quit/ মোটেও সমর্থন করে না -exit
phk

5

ডিরেক্টরিটি এটি খুঁজে পেতে একটি নতুন শেল চালানোর জন্য আপনি এটি তৈরি করতে পারেন।

exec find /media/storage -name "Fedora" -execdir "$SHELL" \;

যার পরে বর্তমান ডিরেক্টরিটি হ'ল এতে ফেডোরা নামের একটি ফাইল রয়েছে। ;)

স্পষ্টতই এটি কেবল যা চান তা সাদৃশ্যযুক্ত কিছু করে যদি আপনি ইন্টারেক্টিভভাবে আদেশগুলি টাইপ করেন।


4

সহ zsh:

cd /media/storage/**/Fedora([1]:h)

থেকে cdপ্রথম (ক্রম অনুযায়ী) যে ডিরেক্টরি নামক কোনো ফাইল, সেগুলিতে Fedora

  • **: যে কোনও স্তরের ডিরেক্টরি (লুকানো ডায়ারগুলি ডিফল্টরূপে বাদ দেওয়া হয়, Dসেগুলি অন্তর্ভুক্ত করতে গ্লোব কোয়ালিফায়ার ব্যবহার করুন)
  • [1]: শুধুমাত্র প্রথম
  • :h: মাথা পরিবর্তক: dirname নিতে।

বিপরীতে cd "$(find ...)", ডিরেক্টরি নামটি যদি একটি নতুন লাইনের অক্ষরে শেষ হয় তবে এটিও কাজ করে। আর একটি সুবিধা হ'ল কোনও মিল নেই ততক্ষণ আপনি কোনও মিলের ত্রুটি বার্তাটি পাবেন (যখন বেশিরভাগ শেলগুলিতে cd ""নিঃশব্দে কিছুই করবে না)।

একটি অপূর্ণতা এটি /media/storageফিরে আসার আগে পুরো ক্রল হবে ।


ব্যাশে, cdএকাধিক আরোগুলি সহ যেভাবেই কেবল প্রথম আরগটি দেখায়, তাই যদি পথের কোনও স্থান না থাকে তবে cd $(dirname /media/storage/**/Fedora)(সাথে shopt -s globstar) কাজ করবে । এটি সঠিকভাবে উদ্ধৃত পেতে, আমি মনে করি একটি ব্যাশ অ্যারের সবচেয়ে সহজ পদ্ধিতি হল হল: target=(/media/storage/**/Fedora); cd "${target%/*}"। তবে সেই মুহুর্তে ইন্টারঅ্যাকটিভভাবে আসার পরিবর্তে আউটপুট অনুলিপি / পেস্ট করার জন্য মাউসটি ব্যবহার করা আরও দ্রুত হবে।
পিটার

2
@ পিটারকর্ডস, অনেকগুলি dirnameবাস্তবায়ন একের বেশি যুক্তি গ্রহণ করবে না। মনে রাখবেন যে এটি স্পেস নয় , বর্তমানে এটি কোনও অক্ষর $IFS(স্পেস, ট্যাব এবং ডিফল্টরূপে নতুন লাইন) এবং ওয়াইল্ডকার্ড অক্ষর। নোট করুন যে bashএর cdএকাধিক যুক্তি গ্রহণ করবে কিনা তা নির্ভর করে এটি কীভাবে সংকলিত হয়েছিল ( CD_COMPLAINSইন config-top.h)। কেউ ভাবতে পারেন যে ভবিষ্যতের সংস্করণগুলি bashশেষ পর্যন্ত zsh এর মতো দুটি আরগ বৈশিষ্ট্যও বাস্তবায়ন করবে।
স্টাফেন চেজেলাস

ধন্যবাদ। আমি স্রেফ জিএনইউ কোর্টিলস ডায়ারনেম ম্যানপেজে তাকালাম। Dirname সংস্করণ যাইহোক ভয়ঙ্কর; আমি কেবল এটিকে এমন কিছু হিসাবে উল্লেখ করেছি যা আপনি কাজ করার ক্ষেত্রে ইন্টারেক্টিভ চেষ্টা করতে পারেন। আমার অ্যারে-ভিত্তিক সংস্করণটি সেগুলির কোনও সমস্যায় ভুগছে না, যেহেতু "${target%*/}"কেবলমাত্র প্রথম অ্যারে উপাদানটিতে ( /Fedoraস্ট্রাইপযুক্ত) প্রসারিত । আমি মনে করি যে সংস্করণটি পথের কোনও সম্ভাব্য অক্ষরের বিরুদ্ধে সম্পূর্ণ দৃ rob়।
পিটার কর্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.