ডিরেক্টরি ছাড়া ফাইলগুলি কীভাবে তালিকাভুক্ত করা যায় এবং নাম দ্বারা ফিল্টার করা যায় (এলএস বিকল্পগুলি)


42

আমার কাছে একটি ডিরেক্টরি আছে uploads। এটিতে অনেকগুলি ফাইল রয়েছে, এবং কয়েকটি সাব-ডাইরেক্টরি রয়েছে যার ফলে ফাইলগুলি থাকে।

আমি কি (এমন এক ধাপে) নিম্নলিখিত পদ্ধতিগুলি করতে পারি এমন কোনও উপায় আছে:

  1. রুট আপলোড ডিরেক্টরিতে কেবল ফাইলগুলি তালিকাভুক্ত করুন - আমি সাবফোল্ডারের নাম বা তাদের বিষয়বস্তু দেখতে চাই না;

    এবং

  2. শুরু হওয়া কোনও ফাইলের তালিকা তৈরি করবেন না t_

আমি -dপতাকা সম্পর্কে জানি , তবে এটি আমার যা চাই তা পুরোপুরি পায় না।

উত্তর:


53

এটি একটি কাজের মতো শোনাচ্ছে find

  • -maxdepthকেবলমাত্র বর্তমান ডিরেক্টরিটি ফেরত দিতে ব্যবহার করুন , সাবফোল্ডারগুলির মধ্যে পুনরাবৃত্তভাবে অনুসন্ধান না করে
  • -type fডিরেক্টরি বা ডিভাইস নোড বা অন্য যে কোনও কিছুই নয় কেবল ফাইলগুলি ফেরত দিতে ব্যবহার করুন
  • আপনি চান না এমন নাম সহ ফাইলগুলি এড়ানোর জন্য -notএবং যদি একটি সংমিশ্রণ ব্যবহার করুন-name

এটি এই মত একত্র হতে পারে:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'

ধন্যবাদ! আমি সিএলআই-তে বেশ নতুন এবং এর আগে কখনও সন্ধানের ব্যবহার করিনি। আমি অবশ্যই এটি আরও দেখুন।
এমিএস

2
@ এমমিস: আপনি এখানে আরও একটি ছোট কৌশল দরকারী বলে মনে করতে পারেন। @ গিলস -exec ls -lG -- {} +তার উত্তর ব্যবহার করে উল্লেখ করেছেন অতিরিক্ত বিকল্পের সাহায্যে আউটপুট পেতে। -lsLs এর বিস্তারিত দর্শনটির দ্রুত এবং নোংরা অনুমান পেতে আপনি এই অনুসন্ধানে কেবল একটি যুক্ত করতে পারেন ।
কালেব

18

জিএনইউ এলএস (অর্থাত্ এমবেডেড লিনাক্স সিস্টেমে ls কমান্ড এবং সাইগউইন, যা অন্য কয়েকটি ইউনিয়নে উপলব্ধ) তাদের নামের উপর ভিত্তি করে কিছু ফাইল আড়াল করার বিকল্প রয়েছে। যদিও ডিরেক্টরিগুলি উপেক্ষা করার কোনও উপায় নেই।

ls --hide='t_*' uploads

আর একটি পদ্ধতি হ'ল আপনার শেলটি ম্যাচটি করে। বাশ, ksh এবং zsh এর !(t_*)সাথে মিলে যাওয়া ফাইলগুলি বাদে সমস্ত ফাইলের সাথে মিলে যাওয়ার একটি প্রত্যাখ্যান প্যাটার্ন রয়েছে t*; ব্যাশে এই বৈশিষ্ট্যটি চালু করা দরকার shopt -s extglob, এবং zsh এ এটি চালু করা দরকার setopt ksh_glob। Zsh এর সমতুল্য সিনট্যাক্সও রয়েছে ^t_*যা চালু করা দরকার setopt extended_glob। এটি এখনও ডিরেক্টরিগুলি উপেক্ষা করে না। জেডএস-এর একটি অতিরিক্ত বৈশিষ্ট্য রয়েছে যা কেবল নাম দিয়ে নয় মেটাডেটা এবং আরও অনেকগুলি: গ্লোব কোয়ালিফায়ার দ্বারা ফাইলগুলি মেলাতে দেয় । (.)নিয়মিত ফাইলগুলিতে সীমাবদ্ধ করতে ম্যাচের শেষে যুক্ত করুন । প্রত্যাখ্যান ^নামের মিলের সিনট্যাক্সের একটি অংশ, সুতরাং এর ^t_*(.)অর্থ হল "সমস্ত নিয়মিত ফাইলগুলি মিলছে না t_*" এবং "নিয়মিত ফাইলগুলির সাথে মিলে না এমন সমস্ত ফাইল" নয় t_*

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

আপনি যদি উন্নত সরঞ্জামগুলি ছাড়া নিজেকে খুঁজে পান তবে আপনি যে কোনও ইউনিক্সে এটি করতে পারেন find। আপনি কমান্ড লাইনে সাধারণত যে ধরণের জিনিস টাইপ করবেন তা নয়, তবে এটি শক্তিশালী এবং সুনির্দিষ্ট। কালেব ইতিমধ্যে জিএনইউ অনুসন্ধানের মাধ্যমে এটি কীভাবে করবেন তা দেখিয়েছে-maxdepthবিকল্প পোর্টেবল নয়; -pruneপরিবর্তে পুনরাবৃত্তি findথেকে থামার জন্য আপনি পরিবর্তে ব্যবহার করতে পারেন ।

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

প্রতিস্থাপন -printদ্বারা -exec ls -lG -- {} +চালানো lsফাইল আপনার প্রিয় বিকল্পগুলি সহ।

উপরের সমস্ত কমান্ডগুলি ডট ফাইলগুলি আড়াল করে (যেমন ফাইলগুলির নাম যার সাথে শুরু হয় a .)। আপনি, সেগুলিকে প্রদর্শন করে পাস করতে চান, -Aকরতে ls, অথবা যোগ Dzsh মধ্যে উল্লিখিত glob কোয়ালিফায়ার ( ls uploads/^t_*(.D))। এর সাহায্যে find, আপনি কেবল এটি একটি স্তর পুনরাবৃত্তি করার একটি ভিন্ন পদ্ধতি ব্যবহার করতে পারেন ( findডট ফাইলগুলিকে বিশেষভাবে আচরণ করে না)। findআপনি কেবল বর্তমান ডিরেক্টরিতে চালিত হলে এটি সম্পূর্ণরূপে কাজ করে ।

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

3
আপনি একটি দিন কাজ আছে? ;-) আমি আপনার উত্তরগুলির বিবরণের দৈর্ঘ্য এবং স্তরে অব্যাহত আছি, এমনকি ইউনিক্স এসই-তে এখানে সাদামাটা প্রশ্নের কাছেও! .. যাইহোক এটি চালিয়ে যান! :)
অ্যালেক্স

ধন্যবাদ! দুর্দান্ত বিবরণ। আমি জানি না আমার কাছে এখন "উন্নত সরঞ্জাম" আছে কি না; আমি কর্মক্ষেত্রে একটি ম্যাকে আছি (যদিও বাড়িতে লিনাক্স, তাই আমি নিশ্চিত যে এটি কোনও সময়ে কার্যকর হবে))
এমিএস

@ এমএমআইএস: আপনার লিনাক্স বাক্সের জন্য আমার ব্যবহারের -maxdepthকাজ করা উচিত, তবে গিলস "পোর্টেবিলিটি" সমস্যাটি উল্লেখ করেছেন যে বিএসডি find(ওএসএক্সেও আমি মনে করি) কিছুটা ভিন্ন প্রাণী, সুতরাং আপনারও তার উত্তর প্রয়োজন হতে পারে। @ গিলস: জেডশ ট্রিকের জন্য +1!
কালেব

1
@ গিলস: কিছু সম্পর্কে এতটা সরস মন্তব্য মাথায় pruneআসে না, তবে আমি কেবল এটুকু বলে যেতে পারি যে যখন আমি নিজের সিস্টেমে ঘুরে বেড়াচ্ছি তখন " এই কমান্ডটি যদি আমি চালু থাকতাম তবে কি এই ভাবনাটি কাজ করবে? " এআইএক্স, সোলারিস বা এমআইএনআইএক্স 3 "আনুমানিক ... স্ট্যান্ডবাই ... মিটার রিডিং পেতে আমার বেশ কষ্ট হচ্ছে ... প্রদর্শনটি হিমশীতল 0.00
কালেব

2
Gnu এর lsকোন --use-telepathyবিকল্প নেই? আপনার পছন্দের ফাইলগুলি প্রদর্শন করার দ্রুততম উপায় এটি। এটি যদিও পোর্টেবল নাও হতে পারে।
সন্দেহভাজন জিম

8
ls -l /folder | grep ^- | awk '{print $9}'

$9এই বিবৃতিতে কী আছে ?
এমিএস

3
@ এমমিএস এর অর্থ আউটপুটটির 9 ম ক্ষেত্র / কলাম। এই উত্তর আউটপুট পার্সls করার চেষ্টা করছে ।
jw013

print আইএমও $ NF` আরও ভাল। F এনএফ এর অর্থ ক্ষেত্রের সংখ্যা, যা 9 হবে এবং এটি ডাব্লুকেতে সাধারণ ব্যবহার হিসাবে অন্যকে $ এনএফ সম্পর্কে শেখানোর ভাল সুযোগ হিসাবে ব্যবহার করে।
এলিজা লিন

1
ls -l | grep -v ^d | grep name$

এই সমাধানটি (যার জন্য একাধিক কমান্ড এবং পাইপগুলির প্রয়োজন) কী বেশি পছন্দসই হবে find?
HalosGhost

এটি সংক্ষিপ্ত, পড়তে সহজ এবং ls কমান্ড কনভেনশনটির সাথে থাকে। সন্ধানের কমান্ড আর্গুমেন্টগুলির চেয়ে মনে রাখা আমার পক্ষে সহজ। বিকল্পগুলির জন্য প্রত্যেকে তাদের নিজস্ব এবং কুদো!
tkjef

0

lsপাইপ এবং পাইপ ব্যবহার করে শট দেই :

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

বলুন শেষ কলামটি নবম।


1
স্পেস সহ ফাইল থাকলে কী হবে?
jordanm

0

যদি সন্ধানের ম্যাক্সডেপথ বহনযোগ্যতার সমস্যাটি উদ্বেগজনক হয় তবে আপনি এটি ব্যবহার করতে পারেন:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

আমি বিশেষজ্ঞ নই, তবে আমি মনে করি এটি কাজ করা উচিত। আমি মনে করি এটি কিছুটা রহস্যজনক দেখাচ্ছে তবে আপনি যদি অবাস্তব বক্তৃতা করেন তবে তা সত্যই নয়। F NF এর পরিবর্তে $ 9 ব্যবহার করা যেতে পারে। আপনি এছাড়াও করতে পারেন:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

যা একই কাজ করে (তবে সম্ভবত আগের চেয়ে কম দক্ষতার সাথে ???))

আসলে, অন্যান্য পোস্টগুলি সম্পর্কে চিন্তাভাবনা করার পরে এটির মতো দেখাচ্ছে

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

এটি একটি আরও ছোট এবং পরিষ্কার উপায়।

কেউ ভুল হলে আমাকে সংশোধন করুন। :-)


পার্সিং lsকরা সাধারণত ভাল ধারণা নয় । আপনার অ্যাজিক ট্রিকস উদাহরণস্বরূপ শ্বেত স্পেসযুক্ত ফাইলের সাথে ব্যর্থ হবে।
মাদুর

@ ম্যাট - সংশোধন করার জন্য আপনাকে ধন্যবাদ। আপনি (এবং jw013) নির্দেশিত নিবন্ধটি পড়ার পরে, আমি দেখতে পাচ্ছি যে সঠিক ফাইলের নামগুলি আউটপুট দেওয়ার জন্য ls কে বিশ্বাস করা যায় না। এমনকি যদি আমি ডাব্লু ডলার থেকে লাইন এর শেষের দিকে (হোয়াইটস্পেসগুলি অন্তর্ভুক্ত করতে) প্রিন্ট করার জন্য অ্যাডক কোডটি পুনরায় লিখতে চাইতাম তবে এই এলএস আউটপুটটি এখনও ভুল হতে পারে। এটি হতাশাজনক এবং আইএমও সংশোধন করা উচিত। আবার ধন্যবাদ.
kkaszub


-1

এই উপনামটি ব্যবহার করে দেখুন:

alias l='ls -hLlF'

ls -hLlFউপ-ডিরেক্টরিগুলি দেখায় এবং এটি ফাইলগুলি শুরু করে দেখায় t_। সুতরাং কিভাবে এই প্রশ্নের উত্তর দেয়?
রাফেল অ্যারেনস

সম্ভবত আমি প্রশ্নটি ভুল বুঝেছি। ls -hLlF লিঙ্কযুক্ত ডিরেক্টরিগুলির লক্ষ্য নির্দেশকগুলি দেখায় না।
দানাদার

তাই মনে হয়. কিন্তু আপনি প্রশ্নের অন্যান্য উত্তর পড়েন নি?
রাফেল অ্যারেনস

-1

সহজ কিছু:

ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d


(1) এই উত্তরটি এত সহজ, এটি আগে দেওয়া হয়েছিল। (২) আপনি কেন বিশ্বাস করেন যে আপনাকে ডিরেক্টরিটির পুরো পথ নির্দিষ্ট করতে হবে?
স্কট 20

@ স্কট - সমাধানটি পাওয়ার জন্য এটি একটি খুব দ্রুত এবং সহজ উপায়। উত্তরটি সার্বজনীন করার জন্য পুরো পথটি নির্দিষ্ট করা হয়েছিল ...
31:38
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.