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


28

মনে করুন যে আমার কাছে .txt , .pdf এবং অন্যান্য ফাইল রয়েছে folder আমি "অন্যান্য" ফাইলগুলি তালিকাবদ্ধ করতে চাই (যেমন ফাইলগুলি। টেক্সট বা .pdf এক্সটেনশন না থাকা )। এটি কীভাবে করবেন সে সম্পর্কে আপনার কোনও পরামর্শ আছে?

প্রদত্ত এক্সটেনশন না থাকা ফাইলগুলি কীভাবে তালিকাভুক্ত করতে হয় তা আমি জানি। উদাহরণস্বরূপ, আমি .txt ফাইল ব্যতীত সমস্ত ফাইল তালিকাবদ্ধ করতে চাই, তবে হয়

find -not -iname "*.txt"

অথবা

ls | grep -v '\.txt$' | column

কাজ মনে হচ্ছে। তবে, আমি .txt ফাইল বা .pdf ফাইল ব্যতীত কীভাবে সমস্ত কিছু তালিকাভুক্ত করতে পারি ? দেখে মনে হচ্ছে যে আমাকে কিছুটা যৌক্তিক "বা" ইন findবা ইন ব্যবহার করতে হবে grep


2
মনে রাখবেন যে lsবনাম findবনাম গ্লোব্বিংয়ের আচরণ লুকানো ডটফিলের জন্য পৃথক হতে পারে।
jw013

1
আরেকটি বিষয় মনে রাখতে হবে: findপুনরাবৃত্তির মতো সাব-ডাইরেক্টরিগুলিকে অনুসরণ করবে ls। আরও ভালো ব্যবহার -maxdepth 1করার findজন্য এটি ব্যবহার করুন ls
jw013

সুতরাং কোন recursive, শুধু বর্তমান dir ফাইল তালিকা?
ডেইজি

উত্তর:


28

ধরে নিই যে এর উপযুক্ত সংস্করণ রয়েছে ls, এটি সম্ভবত সহজতম উপায়:

ls -I "*.txt" -I "*.pdf"

আপনি যদি সমস্ত উপ-ডিরেক্টরিতে পুনরাবৃত্তি করতে চান:

ls -I "*.txt" -I "*.pdf" -R

8
জিএনইউ lsবিকল্পগুলি পোর্টেবল নয়।
বাহামাত

4
lsযেভাবেই হোক পোর্টেবল স্ক্রিপ্টগুলির মধ্যে আসলেই অন্তর্ভুক্ত নয়, তাই আমি ধরে নিচ্ছি যে ওপি কেবল ইন্টারেক্টিভ ব্যবহারের বিষয়ে জিজ্ঞাসা করছে।
jw013

1
কেন এলএস পোর্টেবল নয়? আমার তখন কী ব্যবহার করা উচিত?
ফ্রিডো

28

সমর্থন সন্ধান করুন -o

find . ! '(' -name '*.txt' -o -name '*.pdf' ')'

অগ্রাধিকারটি সঠিক করার জন্য আপনার প্রথম বন্ধনী প্রয়োজন। অনুসন্ধান অনেক স্টাফ করে না; আমি এর ম্যানপেজের মাধ্যমে পড়ার পরামর্শ দিচ্ছি।

আপনি একটি বা ইন করতেও পারেন grep(তবে সত্যই, আপনার আউটপুটটি বিশ্লেষণ করা উচিত নয়ls )

ls | grep -Ev '\.(txt|pdf)$' | column

1
ধন্যবাদ! আমি কেন আউটপুট পার্স করব না ls?
অ্যান্ড্রু

6
@ অ্যান্ড্রু প্রথমে, কারণ এর ভঙ্গুর (এটিতে একটি নতুন লাইন সহ একটি ফাইলের নাম বিবেচনা করুন — হ্যাঁ, এটি একটি বৈধ ফাইলের নাম — সন্ধানের -প্রিন্ট / / এক্সেক / -ডিলিট / ইত্যাদি that সমস্যাটি এড়ান); দ্বিতীয়ত, কারণ সাধারণত একটি সহজ উপায় আছে।
ডারোবার্ট

ছাড়াও findর manpage, আমি মনপ্রাণ দিয়ে সুপারিশ সম্পর্কে ইউনিক্স শক্তি সরঞ্জাম প্রবন্ধ findযেমন docstore.mik.ua/orelly/unix3/upt/ch09_06.htm এবং docstore.mik.ua/orelly/unix3/upt/ch09_12.htm
ওয়াইল্ডকার্ড

শুধু মানুষের জন্য বিবৃতিটি ডিকোড করতে সহায়তা করার জন্য:find . NOT ( *.txt OR *.pdf )
উইসবাকি

12

সঙ্গে bashglobbing বাড়ানো (সঙ্গে চালু shopt -s extglob), উল্লিখিত glob !(*.txt|*.pdf)কাজ করা উচিত। আপনি এই গ্লোবটি সরাসরি এমন কোনও কমান্ডের কাছে যেতে পারেন যা ফাইল আর্গুমেন্ট গ্রহণ করে তবে এতে সীমাবদ্ধ নয় ls


1
+1 তবে আপনি যদি উপ-ডিরেক্টরিগুলি থাকেন তবে তাদের বিষয়বস্তুগুলিও তালিকাভুক্ত হবে; -dএটি এড়াতে ব্যবহার করুন :ls -d !(*.txt|*.pdf)
কিংবদন্তি 2k

আপনাকে ধন্যবাদ, আমি ঠিক সিনট্যাক্স একাধিক ফাইল গ্রহণ করতে খুঁজছেন ছিল, এই ভাল এখানে মাপসই করা হবে stackoverflow.com/questions/216995/...
Freedo

6

ইন zshসঙ্গে extendedglob:

print -rl -- *~*.(txt|pdf)

অথবা

print -rl -- ^*.(txt|pdf)

অথবা এর সাথে kshglob(হ্যাঁ, এটি হ'ল কেশ গ্লোব্বিং "বাশ বর্ধিত গ্লোববিং" নয়):

print -rl -- !(*.txt|*.pdf)

মনে রাখবেন যে সেগুলি ডট ফাইলগুলিও বাদ দেয়।

ksh93 এর FIGNORE(মিস) বৈশিষ্ট্যটি রয়েছে:

FIGNORE='@(.|..|*.txt|*.pdf)'
printf '%s\n' *


3

ডারোবার্টের পরামর্শ অনুসারে, আপনার সেরা বাজি ব্যবহার করা find। তবে আপনি বাস্তবে অন্যান্য কমান্ডের সাথে পাইপলাইনে ফলাফলটি ব্যবহার করতে পারেন

জিএনইউ (এবং কিছু বিএসডি'র) প্রিনিকে findসমর্থন করে -print0যা এটি এনওএল চরিত্রের দ্বারা শেষ হওয়া ফাইলের নাম মুদ্রণ করতে বলে , যা কোনও অক্ষরের কোনও ফাইলের নামের মধ্যে অনুমোদিত নয় এবং গ্যারান্টি দেয় যে কোনও সংঘর্ষ হবে না। অন্যান্য কমান্ডগুলিতে NUL কে তাদের ইনপুট ডেলিমিটার হিসাবে ব্যবহার করার জন্য নির্দেশ দেওয়া যেতে পারে ।

যার মধ্যে সর্বাধিক গুরুত্বপূর্ণ হ'ল জিএনইউ xargs, যা আপনার নির্দিষ্ট কমান্ডটি চালায় এবং এতে কমান্ড লাইন আর্গুমেন্ট হিসাবে ফাইলগুলির তালিকা প্রেরণ করে। আপনি xargs -r0অনুসন্ধানের -print0উদাহরণের সাথে একযোগে দৌড়াতে চান :

find . -type f ! \( -name \*.pdf -o -name \*.txt \) -print0 | xargs -r0 ls -ld

এটি নিরাপদে সমস্ত পিডিএফ এবং টিএসটি ফাইলের একটি দীর্ঘ ডিরেক্টরি তালিকা মুদ্রণ করে, নাম সহ ফাঁকা স্থান বা অক্ষর অক্ষর সহ।

আপনি এটি GNU এর tarসাথে নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন :

tar -zcf myarchive.tar.gz --null --files-from <(
  find . -type f ! -name \*.tar.gz -print0)

এটি সমস্ত ফাইলের একটি tar.gz ফাইল তৈরি করে যার নাম .tar.gz এ শেষ হয় না

rsync-0প্যারামিটারের সাথে নাল-সীমাবদ্ধ ফাইলগুলিও গ্রহণ করে , অন্য অনেকের মতো। তবে xargsআপনি সাধারণত এই ধরণের উদ্দেশ্যে ব্যবহার করতে পারেন এমন আঠালো। হয় হয় বা findএর -execবৈশিষ্ট্য।


tarকমান্ড উদাহরণস্বরূপ একটি ভাল নেই। যদিও বেশিরভাগ উদ্দেশ্যে, -execএটি আরও ভাল ফিট।
ওয়াইল্ডকার্ড

1

আপনার যদি একটি উপ-ডিরেক্টরি না থাকে

ls !(*.pdf|*.txt)

কাজ করা উচিত!

কিন্তু

ls -I "*.pdf" -I "*.txt"

সাধারণ উপায়।


0

পরিপূরক হিসাবে, আপনি যদি ব্যাশের সাথে সামঞ্জস্যপূর্ণ শেল ব্যবহার করেন তবে আপনি প্যাটার্ন মিল থেকে পুনরুত্থানের জন্য GLOBIGNORE পরিবর্তনশীলটি ব্যবহার করতে পারেন। লোকটির কাছ থেকে:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

আপনার বিশেষ ক্ষেত্রে:

sh$ (GLOBIGNORE='*.pdf:*.txt'; ls -d *)

অনুগ্রহ করে নোট করুন আমি আমার ইন্টারেক্টিভ শেলের GLOBIGNORE এনভায়রনমেন্ট ভেরিয়েবল পরিবর্তন না করার জন্য আমি একটি কমান্ডটি সাব-শেল হিসাবে (প্রথম বন্ধনী ব্যবহার করে) চালাচ্ছি।

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