'Ls' কমান্ডের সাহায্যে ফাইল এবং ডিরেক্টরিগুলি গণনা করুন


11

lsবর্তমান ডিরেক্টরিতে কমান্ড চালান এবং আউটপুট পান:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

আমি তাদের যেমন গণনা করতে চাই:

1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public

এটি lessএকটি মধ্যবর্তী উপায়ে ব্যবহার করে অর্জন করা যেতে পারে

ls | less -N

কীভাবে তাদের সরলভাবে গণনা করা যায়?


আপনি কি চান যে এটি সবসময় ঘটে, বা কেবল কখনও কখনও? প্রথম ক্ষেত্রে, আপনি উত্তরগুলিতে যে কোনও একটি কমান্ডের জন্য ls এর একটি উপনাম তৈরি করতে পারেন; দ্বিতীয়টিতে, একটি নতুন উপনাম তৈরি করুন - কমান্ডটিতে "lsn" বলুন।
জামেএসকিফ

উত্তর:


16

বা সহজভাবে করুন:

ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile

থেকে man nl:

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers

13

আপনার lsঅন্য কমান্ডের আউটপুট পাইপ করা উচিত । আমার পরামর্শটি এইভাবে ব্যবহার awkকরা :

$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
  • দয়া করে নোট করুন যে ফাইলটিতে তার নামে file\nnewlineনতুন লাইন অক্ষর রয়েছে \nযা বিকল্পটি দিয়ে পালিয়েছে -b

  • বিকল্পগুলি --group-directories-firstফাইলগুলির আগে ডিরেক্টরিগুলি আউটপুট দেয়।

লুপের জন্য ব্যবহারের অন্য সম্ভাব্য উপায় হ'ল (তবে এই ক্ষেত্রে ডিরেক্টরিকে ভিক্ষাবৃত্তিতে ডিরেক্টরিগুলি স্থাপন করা আরও কঠিন হয়ে উঠবে):

n=1; for i in *; do echo $((n++)). $i; done

11

যদি কেবল একটি নম্বর দেখানো ক্ষেত্রে হয় তবে আপনার নিজের less -Nউপায় অনুসারে নিম্নলিখিত কয়েকটি বিকল্প রয়েছে :

$ ls |cat -n
$ ls |nl

আপনি যদি কাস্টমাইজড আউটপুট নম্বরটি চান, তবে আমি findআপনাকে যা মুদ্রণ করতে চাই তা ব্যবহার এবং করার পরামর্শ দেব :

find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +

পিসিক্সলি, আপনি কি করবেন:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +

এই ক্ষেত্রে, iপূর্বেই ইনিশিয়ালাইজ করতে হবে:i=0; find ...
rexkogitans

এটি এখানে অগত্যা নয়, কারণ -exec sh -c '....' পৃথক sh শেলের নীচে চলছে।
αғsнιη

3

আপনি এটি একটি সংক্ষিপ্ত বাশ স্ক্রিপ্ট দিয়ে পুরোপুরি করতে পারেন:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
    printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

আপনি এমনকি অভিনব হতে পারেন এবং 9 টিরও বেশি ফলাফলের জন্য লাইন নম্বর প্যাড করতে পারেন:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
    printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

ব্যবহার

ধরে নিচ্ছি যে আপনি numbered-ls.shবর্তমান স্ক্রিনিংটিকে কার্যক্ষম ডিরেক্টরি হিসাবে এক্সিকিউটেবল ফাইল হিসাবে সংরক্ষণ করেছেন :

./numbered-ls.sh [DIRECTORY]

যুক্তিটি DIRECTORYalচ্ছিক এবং বর্তমান ওয়ার্কিং ডিরেক্টরিতে ডিফল্ট।

ব্যাখ্যা

  1. যদি স্ক্রিপ্টটি আর্গুমেন্টের সাথে আহ্বান জানানো হয় তবে প্রথম আর্গুমেন্টে কার্য ডিরেক্টরিকে পথে পরিবর্তন করুন।

  2. বর্তমান কার্যনির্বাহী ডিরেক্টরিগুলির সমস্ত এন্ট্রি মেলে এবং সেগুলি সন্ধান করুন। প্রতিটি এন্ট্রি ইনক্রিমেন্টের জন্য একটি কাউন্টার এবং প্রবেশের নামের সাথে এর মানটি মুদ্রণ করুন। প্রবেশের নামে লাইন ব্রেকের অক্ষরগুলি প্রতিস্থাপন করা হয় ^N

  3. cat -vtটার্মিনালটি নিয়ন্ত্রণের অক্ষর হিসাবে ব্যাখ্যা করতে পারে এমন মুদ্রণযোগ্য অক্ষরগুলি ধারণ করে এমন ফাইল নামগুলির সাথে করপুণতার সাথে আউটপুটটি পাইপ করুন ।

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