Ls কমান্ড থেকে আউটপুটটির মাত্র 1 কলামটি আমি কীভাবে প্রতিধ্বন করব?


54

আসুন যখন আমি ls কমান্ড করি তখন আউটপুটটি হ'ল:

file1 file2 file3 file4

এই ক্ষেত্রে ফাইল 2, কেবলমাত্র আউটপুটের একটি নির্দিষ্ট কলাম প্রদর্শন করা সম্ভব? আমি কোনও সাফল্য ছাড়াই নিম্নলিখিতগুলি চেষ্টা করেছি:

echo ls | $2

মূলত আমি যা করতে চাই তা কেবল দ্বিতীয় কলাম প্রতিধ্বনি হয়, এক্ষেত্রে আমি প্রতিধ্বনিত করতে চাই:

file2

2
পরিস্থিতি যার মাধ্যমে আপনি সত্যিই একটি চান কি কলাম এর lsআউটপুট?
মিচাস

11
একটি সাধারণ নিয়ম হিসাবে, আপনার কখনই ls পার্স করা উচিত নয় । আপনার প্রয়োজনীয় তথ্য পাওয়ার প্রায় সবসময় আরও ভাল উপায় আছে।
টেরডন

আমি সেই অপরিচিত কাজটি করব না: পি (দুঃখিত আমি এই শব্দগুচ্ছটি সবই পছন্দ করেছি) ফাইল এবং ফোল্ডারগুলির নামগুলির উপর কলামের সংখ্যা নির্ভর করে, তাই দ্বিতীয় কলামটি আপনি চান সেগুলি হতে পারে বা নাও হতে পারে বা একের মধ্যে থাকতে পারে lsএবং কিছু ফাইল / ফোল্ডার তৈরি করার পরে এটি আর আপনি চান নাও হতে পারে। যেমনটি টেরডন উল্লেখ করেছেন যে আপনি চান তা পাওয়ার আরও ভাল উপায় রয়েছে
YoMismo

উত্তর:


81

নিম্নলিখিত কমান্ডটি ls আউটপুটকে একটি কলামে ফর্ম্যাট করবে

ls -1 /directory

2
কিন্তু এটা আপনি ঠিক একটি কলাম দেয় না ওপি আগ্রহী।
Anthon

1
এটি সঠিক করার জন্য: ls -1 /directory | head -2 | tail -1বাls -1 /directory | perl -ne 'print if $. == 2'
কেউবুবুটিউইচজ

@ কেউববুফিটোইচিজ ls | sed -n '1p;q'সহজ মনে হচ্ছে
ফিক্সিম্যান

3
আমি উত্তরটি খুঁজছিলাম, তবে ওপি-র প্রশ্নের জন্য নয়।
মাইকেল ল্যাং

36

আপনি এটি সন্ধান করছেন:

ls -C | awk '{ print $2 }'

যাইহোক, ধরে নিচ্ছেন যে আপনি এই ফাইলটির নামটি পরে চেষ্টা করতে এবং ব্যবহার করতে যাচ্ছেন, এটি করবেন না, কারণ এটি শ্বেত স্পেসযুক্ত ফাইলের নামগুলি ভাঙবে। পরিবর্তে, ফাইলগুলিকে একটি অ্যারেতে রাখুন এবং দ্বিতীয়টি পান যা কোনও পার্সিং এড়াতে এড়িয়ে যায়:

files=(*)
printf '%s\n' "${files[1]}"

আপনি যে ক্রমে ফাইলগুলি ফিরে পাবেন সেটির মানের উপর নির্ভর করে LC_COLLATE। এই হিসাবে, আপনি LC_COLLATE=Cপ্রথমে সেট করতে চাইতে পারেন , যদি আপনি কোনও কোণার ক্ষেত্রে "স্ট্যান্ডার্ড" বাছাই করতে চান।


নোট করুন যে অ্যারে সূচকগুলি 1বোধগম্য শেল (zsh, yash, মাছ, csh, tcsh, rc, es ...) এবং 0ksh এবং bash এ শুরু হয়। সমস্ত বোর্নের মতো শেলগুলির পোর্টেবল সমাধানের জন্য, আপনি ব্যবহার করতে পারেন: set -- *; printf '%s\n' "$2"পরিবর্তে।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলা অন্তত এই প্রশ্নের জন্য, ট্যাগগুলিতে "ব্যাশ" অন্তর্ভুক্ত থাকে, সুতরাং এই উত্তরটি সেই শেলের সাথে নির্দিষ্ট।
ক্রিস ডাউন

ls -C | awk '{মুদ্রণ $ 1} দেখতে একই আউটপুট দেয় ... $ 2 কেন?
বোকটুলাস

7

যখন আউটপুট টার্মিনাল নয় তখন আপনাকে সিঙ্গল-কলাম মোড -Cহিসাবে যুক্ত করতে হবে lsawkতারপরে দ্বিতীয় কলামটি মুদ্রণ করে:

ls -C | awk '{print $2}'

2

আমি মনে করি আপনি খুঁজছেন

ls -1

এটি অনুমতি, মালিক, গ্রুপ, তারিখ, আকার ... তবে একক কলামে সাধারণ ফাইলের নাম দেখায় না।


1
এই উত্তরটি কেবল ভুল নয়, এটি আগেও দেওয়া হয়েছিল।
স্কট

যদিও আমি বুঝতে পারি যে এটি মূল প্রশ্নের জন্য ভুল, তবে এটিই আমি খুঁজছিলাম। তাই আপনাকে ধন্যবাদ.
আন্তমডেলজ


0

ইতিমধ্যে উল্লেখ করা হয়েছে - lsআউটপুট পার্সিংয়ের জন্য কলামগুলি ব্যবহার করা খুব জোরালো নয় কারণ lsআপনার ফাইলের নাম দৈর্ঘ্য এবং টার্মিনাল প্রস্থ অনুসারে লাইনগুলি ভেঙে দেয়। উপাদানগুলির তালিকার একটি একক কলাম প্রদর্শিত হলেও এটি প্রায়শই আকর্ষণীয়। আপনি কাট কমান্ড ব্যবহার করে এটি করতে পারেন:

echo file1 file2 file3 file4 | cut -d" "  -f2

প্রদর্শিত হবে

file2

নোট যা -dআপনাকে কলাম ডিলিমিটারটি নির্বাচন করতে দেয়, উদাহরণস্বরূপ

cur -d, -f2

আপনি কমা দ্বারা পৃথক তালিকার দ্বিতীয় কলামটি প্রদর্শন করতে পারেন।


0

মনে করুন আপনি যদি কেবলমাত্র নির্দিষ্ট ফাইল নামটি বর্তমান পথের অধীনে কমান্ডের নীচে প্রদর্শন করতে চান

কমান্ড প্রয়োগ করুন:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

এটি জটিল, কারণ পার্সিং এর ls -Cউপর নির্ভর করে:

  1. ফাইলের নাম দৈর্ঘ্য, (যা নিজেই নির্দিষ্ট করা ফাইল তালিকার উপর নির্ভর করে ls -C)
  2. টার্মিনাল প্রস্থ।
  3. সত্য যে ls -Cআউটপুট স্তম্ভাকার, কিন্তু ক্ষেত্র বিভাজক হিসেবে শূণ্যস্থান সংখ্যা তারতম্য করার জন্য কনফিগার করা হতে পারে।
  4. ফাইলের নামগুলিতে হোয়াইটস্পেসের সম্ভাবনা, (যা lsপ্রদর্শিত নির্বাচিত বিশেষ প্রদর্শন বিকল্পগুলির উপর নির্ভর করে )।

আপাতত, আসুন সমস্যাটি শুরু করা যাক ( যেমন # 4 উপরে নয়), মনে করুন যে ফাইলের নামগুলিতে কোনও সাদা জায়গা নেই । কলাম # 2 মুদ্রণ করতে, এটি কাজ করে:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

এটিকে আনرول করা হচ্ছে:

  • COLUMNS=$COLUMNSগ্যারান্টি দেয় যে দেওয়া কলামের দৈর্ঘ্য | বর্তমান টার্মিনাল প্রদর্শনের সাথে সামঞ্জস্যপূর্ণ রয়েছে। এটি একটি স্বেচ্ছাসেবী মানতে পরিবর্তন করাও কার্যকর হয়, সুতরাং COLUMNS=50বা সেই প্রস্থগুলি অনুসারে জিনিসগুলি পুনরায় সাজানোর COLUMNS=70 কারণ ls -Cহতে পারে।

    অন্য পদ্ধতিটি -wহ'ল স্যুইচটি ব্যবহার করা যেমন :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trক্ষেত্র বিভাজককে সামঞ্জস্যপূর্ণ করে তোলে: প্রতিটি কলামের মধ্যে একটি একক ট্যাব

  • cut কাঙ্ক্ষিত কলামটি আউটপুট করে।



-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

অক্ষর সংখ্যা (54) প্রয়োজনীয় হিসাবে পরিবর্তন করুন যাতে আপনি কেবল নিজের পছন্দসই ডেটা পান।


2
স্পষ্ট করে, 54-অবস্থান থেকে শুরু হওয়া প্রতিটি চরিত্রকে কাটা বলছে; এটি "মানুষের স্বীকৃত" কলামে থামবে না
জেফ স্ক্যালার হলেন

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