একটি স্ট্রিং এবং অনুলিপি আউটপুট মেলে একটি ডিরেক্টরিতে সমস্ত ফাইল তালিকাভুক্ত


1

আমি স্ট্রিংয়ের সাথে মিলে একটি ফাইল সন্ধান করে, আমার এমপি 3 প্লেয়ারে রকবক্স চালিয়ে একাধিক প্লেলিস্ট তৈরি করার চেষ্টা করছি find /cygdrive/g/MUSIC -type f -name "Search Criteria" | /cygdrive/g/PLAYLIST/Playlist Name.m3u8। আমি যখন ব্যবহার করে অনুসন্ধান করি তখন $ find /cygdrive/g/Music -type f -name "*Theme*"আমার ফলাফলগুলি হ'ল:

/cygdrive/g/Music/Movie Masterpieces/14 - 1900's Theme.ogg
/cygdrive/g/Music/Movie Masterpieces/02 - Deborah's Theme.ogg
/cygdrive/g/Music/Star Trek_ The Motion Picture [Disc 1]/01 - Ilia's Theme.ogg

তবে, আমি কোনও ফোল্ডার অনুসন্ধান করতে এবং ভিতরে থাকা ফাইলগুলির নাম আউটপুট করতে সক্ষম হতে চাই:

/cygdrive/g/Music/Cult Themes/01 - The Avengers (1965).ogg       
/cygdrive/g/Music/Cult Themes/02 - Man In A Suitcase (1968).ogg  
/cygdrive/g/Music/Cult Themes/03 - The Saint (1962).ogg

আমার কাছে লিনাক্স টার্মিনাল, সাইগউইন বা উইন্ডোজ কমান্ড প্রম্পট উভয়ই অ্যাক্সেস রয়েছে এবং যে কোনও সমাধানের জন্য আমি কৃতজ্ঞ হব, তবে যদি সম্ভব হয় তবে এক বা দুটি লাইনে।

সম্পাদনা: বেশ কয়েকটি সমাধান পাওয়ার পরে, আমি খুঁজে পেয়েছি সেরা সমাধানটি ছিল:

find /cygdrive/g/MUSIC -type d -iname "*theme*" -print -prune 
| xargs -d '\n' -I {} find {} -name '*.ogg'

এই সমাধানটি অনুসন্ধানটিকে দ্রুততম করে তুলতে সক্ষম হয়েছিল এবং এটি প্রথম প্রতিক্রিয়াটির মতো সংক্ষিপ্ত নাও হতে পারে তবে এখনও এটি সংক্ষিপ্ত। যারা প্রতিক্রিয়া জানিয়েছেন তাদের সবাইকে ধন্যবাদ!

উত্তর:


3

findআউটপুট প্রক্রিয়া করার সঠিক উপায়টি নয় for , তবে এটি লাইন দিয়ে লাইনে পড়া:

find . -type d -iname '*themes*' -print -prune |
while read -r path; do
    find "$path" -name '*.ogg'
done

অথবা

find . -type d -iname '*themes*' -print -prune |
xargs -d '\n' -I {} find {} -name '*.ogg'

বা findএটি করতে দিন:

find . -type d -iname '*themes*' -exec find {} -name '*.ogg' \; -prune

-pruneপিতা-মাতার ডিরেক্টরি এবং একটি উপ-ডিরেক্টরি উভয়ই -inameনিয়মের সাথে মিলে যায় এমন মামলার বিরুদ্ধে একটি সরল সুরক্ষারক্ষেত্র ।

আমি traditionalতিহ্যবাহী এড়িয়ে গেছি -print0 | xargs -d '\0'যেহেতু নতুন লাইনের অক্ষরগুলির সাথে ফাইলের নামগুলি খুব খুব সম্ভবত একটি FAT32 ফাইল সিস্টেমে থাকার সম্ভাবনা খুব কম।


এছাড়াও আপনি স্থির করতে পারে IFS=$'\n'এবং তারপর read line, কিন্তু যে ওয়াইল্ডকার্ড খুব ভঙ্গ যখন আপনি আবার ফাইলের নাম ব্যবহার করেন, তাই ... হাঁ। execসবচেয়ে সংক্ষিপ্ত বিকল্প হবে।
slhck

@ এসএলএইচএইচকি: readওয়াইল্ডকার্ডগুলি প্রক্রিয়া করে না, তাই ব্যবহার করার সময় এটি কীভাবে ভাঙ্গবে তা আমি দেখতে পাই না read line। (আমি দেখতে পাচ্ছি একমাত্র স্থানটি ভেরিয়েবলের প্রসারণের সময় , যা দ্বিগুণ-উদ্ধৃতি দিয়ে সমাধান করা যেতে পারে))
গুরুতরতা

হ্যাঁ আমি প্রসারিত বলতে চাইছিলাম, যাইহোক আপনার উত্তরের ক্ষেত্রে এটি হয়নি। সহজেই কিছু ভুলে যেতে পারে।
slhck

1

এখানে একটি দির (যেমন থিম) অনুসন্ধান করার উপায় রয়েছে এবং এর অধীনে সমস্ত .ogg ফাইল তালিকাভুক্ত করা হয় (পুনরাবৃত্তভাবে):

for x in $(find . -iname "*themes*"); do find $x -iname "*.ogg"; done

আমি মনে করি আপনি আপনার প্রয়োজনের জন্য এই উদাহরণটি কাস্টমাইজ করতে পারেন, যদি এটি ঠিক আপনি চান যা না হয়।


এটি প্রায়শই কাজ করে, একবার বন্ধনী যুক্ত করা হয় for x in $( find ... ); do ..., তবে ফোল্ডারগুলির নামে ফাঁক থাকলে কাজ করে না। দ্রুত প্রতিক্রিয়ার জন্য ধন্যবাদ, আমি যদি আরও কিছু পাই তবে আমি সমাধানটি সামনে রাখব।
jClark94

1
ফাইলের নামগুলির স্পেস অবশ্যই স্পষ্ট হয়ে যাবে, $xআবার ব্যবহার করার সময় গ্লোববিং অক্ষর থেকেও সাবধান থাকবেন ।
slhck
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.