"Du -sh *" এবং "du -sh ./*" এর মধ্যে পার্থক্য কী?


উত্তর:


69
$ টাচ ./-c a 'a \ n12 \ tb' foo
$ ডু -হস *
0 ক
12 খ
0 ফু
মোট 0

আপনি দেখতে পাচ্ছেন যে -cফাইলটি একটি বিকল্প হিসাবে নেওয়া হয়েছিল duএবং এটি রিপোর্ট করা হয় না (এবং এর কারণে আপনি totalলাইনটি দেখেন du -c)। এছাড়াও, ফাইল নামক a\n12\tbআমাদের মনে ফাইল নামক আছে করছে aএবং b

$ du -hs -- *
0       a
12      b
0       -c
0       foo

এটা ভাল. কমপক্ষে এই সময়টি -cবিকল্প হিসাবে নেওয়া হয় না।

$ du -hs ./*
0       ./a
12      b
0       ./-c
0       ./foo

ওটা আগের থেকে ভালো. ./উপসর্গ প্রতিরোধ -cথেকে একটি বিকল্প এবং অভাবে যেমন নেয়া হচ্ছে ./সামনে bআউটপুট ইঙ্গিত কোন যে সেখানে bসেখানে ফাইল, কিন্তু একটি newline অক্ষর সঙ্গে একটি ফাইল (কিন্তু নিচে দেখুন 1 যে আরো digressions জন্য)।

./সম্ভব হলে উপসর্গটি ব্যবহার করা ভাল অনুশীলন , এবং যদি না হয় এবং স্বেচ্ছাসেবী তথ্যের জন্য, আপনার সর্বদা ব্যবহার করা উচিত :

cmd -- "$var"

বা:

cmd -- $patterns

যদি বিকল্পগুলির শেষ চিহ্নিত cmdকরতে সমর্থন --না করে তবে আপনার এটির লেখককে বাগ হিসাবে রিপোর্ট করা উচিত (যখন এটি পছন্দ মতো এবং দলিল হিসাবে নয় echo)

এমন কেস রয়েছে যেখানে ./*সমস্যাগুলি সমাধান --হয় যা হয় না। এই ক্ষেত্রে:

awk -f file.awk -- *

ব্যর্থ হলে একটি ফাইল বলা হয় a=b.txtবর্তমান ডিরেক্টরির মধ্যে (awk পরিবর্তনশীল সেট করে aকরতে b.txtফাইল প্রক্রিয়া করতে এটি কহন পরিবর্তে)।

awk -f file.awk ./*

কোনও সমস্যা নেই কারণ ./aএকটি বৈধ অবত ভেরিয়েবলের নাম নয়, তাই ./a=b.txtভেরিয়েবল অ্যাসাইনমেন্ট হিসাবে নেওয়া হয় না।

cat -- * | wc -l

-বর্তমান ডিরেক্টরিতে যদি কোনও ফাইল ডেকে আনা হয় তবে এটি catতার স্টাডিন থেকে পড়তে বলে ( -বেশিরভাগ পাঠ্য প্রক্রিয়াজাতকরণের জন্য এবং বিশেষত cd/ pushd)।

cat ./* | wc -l

ঠিক আছে কারণ ./-বিশেষ নয় cat

ভালো জিনিস:

grep -l -- foo *.txt | wc -l

এতে থাকা ফাইলগুলির সংখ্যা গণনা করা fooভুল কারণ এটি ধরে নিয়েছে যে ফাইলের নামগুলিতে নতুন লাইন অক্ষর নেই (নতুন ফাইলের অক্ষরগুলি wc -lগণনা করা হয়, grepপ্রতিটি ফাইলের জন্য সেই আউটপুট এবং ফাইলের নিজেরাই থাকা ফাইলগুলি)। পরিবর্তে আপনার ব্যবহার করা উচিত:

grep -l foo ./*.txt | grep -c /

( /অক্ষরের সংখ্যা গণনা আরও নির্ভরযোগ্য কারণ ফাইলের প্রতি প্রতিটিতে কেবল একটি থাকতে পারে)।

পুনরাবৃত্তির জন্য grep, সমতুল্য কৌশলটি হ'ল:

grep -rl foo .//. | grep -c //

./* যদিও কিছু অযাচিত পার্শ্ব প্রতিক্রিয়া থাকতে পারে।

cat ./*

প্রতি ফাইল প্রতি আরও দুটি চরিত্র যুক্ত করে, তাই আপনাকে শীঘ্রই আর্গুমেন্টের সর্বোচ্চ আকারের সীমাতে পৌঁছে দেবে। এবং কখনও কখনও আপনি ./আউটপুট এ রিপোর্ট হতে চান না । ভালো লেগেছে:

grep foo ./*

আউটপুট হবে:

./a.txt: foobar

পরিবর্তে:

a.txt: foobar

আরও বিবর্তন

। মন্তব্যে আলোচনার পরে আমার এখানে প্রসারিত হতে হবে বলে মনে হচ্ছে।

$ du -hs ./*
0       ./a
12      b
0       ./-c
0       ./foo

উপরে, ./প্রতিটি ফাইলের সূচনা চিহ্নিত করার অর্থ আমরা প্রতিটি ফাইলের নাম (শুরু ./) কোথায় শুরু হয় এবং কোথায় এটি শেষ হয় ( ./আউটপুটটির পরবর্তী বা শেষের আগে নতুন লাইনে ) সনাক্ত করতে পারি।

এর অর্থ কী যে এর du ./*বিপরীতে আউটপুটটি du -- *নির্ভরযোগ্যভাবে পার্স করা যায়, যদিও এটি কোনও স্ক্রিপ্টে সহজে হয় না।

আউটপুট যদিও টার্মিনালে যায় তবে ফাইলের নাম আপনাকে বোকা বানাতে পারে এমন আরও অনেক উপায় রয়েছে:

  • অক্ষরগুলি নিয়ন্ত্রণ করুন, পালানোর ক্রমগুলি জিনিসগুলি প্রদর্শিত হওয়ার পথে প্রভাব ফেলতে পারে। উদাহরণস্বরূপ, \rকার্সারটিকে লাইনের শুরুতে \bসরানো হয়, কার্সারটিকে পিছনে সরিয়ে নিয়ে যায়, \e[C(বেশিরভাগ টার্মিনালে) ...
  • একটি টার্মিনালটিতে অনেকগুলি অক্ষর অদৃশ্য হয় যা স্পষ্টর অক্ষর দিয়ে শুরু হয়।
  • ইউনিকোডের অক্ষর রয়েছে যা বেশিরভাগ ফন্টের স্ল্যাশের মতোই দেখতে লাগে

    $ printf '\u002f \u2044 \u2215 \u2571 \u29F8\n'
    /    

    (দেখুন কীভাবে এটি আপনার ব্রাউজারে যায়)।

একটি উদাহরণ:

$ touch x 'x ' $'y\bx' $'x\n0\t.\u2215x' $'y\r0\t.\e[Cx'
$ ln x y
$ du -hs ./*
0       ./x
0       ./x
0       ./x
0       .∕x
0       ./x
0       ./x

প্রচুর পরিমাণে xতবে yনিখোঁজ।

GNULs এর মতো কিছু সরঞ্জাম প্রিন্টযোগ্য অক্ষরগুলিকে প্রশ্ন চিহ্নের সাথে প্রতিস্থাপন করবে (নোট করুন (ইউ + 2215 যদিও প্রিন্টযোগ্য তবে)) যখন আউটপুট টার্মিনালে যায়। জিএনইউ duকরে না।

এগুলি তাদের প্রকাশ করার উপায় আছে:

$ ls
x  x   x?0?.∕x  y  y?0?.?[Cx  y?x
$ LC_ALL=C ls
x  x?0?.???x  x   y  y?x  y?0?.?[Cx

আমরা যখন বললাম যে আমাদের চরিত্র সেটটি ASCII ছিল তার পরে কীভাবে পরিণত হয়েছিল দেখুন ।???ls

$ du -hs ./* | LC_ALL=C sed -n l
0\t./x$
0\t./x $
0\t./x$
0\t.\342\210\225x$
0\t./y\r0\t.\033[Cx$
0\t./y\bx$

$লাইনের শেষ চিহ্নিত করে, সুতরাং আমরা "x"বনামগুলি স্পট করতে পারি "x ", সমস্ত অ-মুদ্রণযোগ্য অক্ষর এবং নন-এএসসিআইআই অক্ষর একটি ব্যাকস্ল্যাশ ক্রম দ্বারা উপস্থাপিত হয় (ব্যাকস্ল্যাশ নিজেই দুটি ব্যাকস্ল্যাশ দ্বারা উপস্থাপিত হবে) যার অর্থ এটি দ্ব্যর্থহীন। এটি জিএনইউ ছিল sed, সমস্ত পসিক্স সম্মতিযুক্ত sedবাস্তবায়নের ক্ষেত্রে এটি একই হওয়া উচিত তবে নোট করুন যে কিছু পুরানো sedবাস্তবায়ন প্রায় ততটা সহায়ক নয়।

$ du -hs ./* | cat -vte
0^I./x$
0^I./x $
0^I./x$
0^I.M-bM-^HM-^Ux$

(মানক না হলেও বেশ সাধারণ, cat -Aকিছু বাস্তবায়ন সহ) এটি একটি সহায়ক এবং একটি পৃথক উপস্থাপনা ব্যবহার করে তবে অস্পষ্ট ( "^I"এবং <TAB>উদাহরণ হিসাবে এটি প্রদর্শিত হয়)।

$ du -hs ./* | od -vtc
0000000   0  \t   .   /   x  \n   0  \t   .   /   x      \n   0  \t   .
0000020   /   x  \n   0  \t   . 342 210 225   x  \n   0  \t   .   /   y
0000040  \r   0  \t   . 033   [   C   x  \n   0  \t   .   /   y  \b   x
0000060  \n
0000061

এটি এক স্ট্যান্ডার্ড এবং দ্ব্যর্থহীন (এবং বাস্তবায়ন থেকে বাস্তবায়নের ক্ষেত্রে ধারাবাহিক) তবে পড়া সহজ নয়।

আপনি লক্ষ্য করবেন যে yউপরে কখনও প্রদর্শিত হয়নি। এটি একটি সম্পূর্ণ সম্পর্কহীন সমস্যা যার du -hs *সাথে ফাইলের নামগুলির সাথে কোনও সম্পর্ক নেই তবে উল্লেখ করা উচিত: কারণ duডিস্ক ব্যবহারের রিপোর্ট করে, এটি ইতিমধ্যে তালিকাভুক্ত কোনও ফাইলের অন্যান্য লিঙ্কগুলির প্রতিবেদন করে না ( duহার্ড লিঙ্কগুলি তালিকাবদ্ধ থাকলেও সমস্ত বাস্তবায়ন এ জাতীয় আচরণ করে না কমান্ড লাইনে)।


+1, সুন্দর এবং পুঙ্খানুপুঙ্খ (যতদূর আমি বলতে পারি ^^)। আমি বিশেষত "গ্রেপ-সি /" সুবিধাটি পছন্দ করি। আরও লক্ষণীয়: ইউনিক্স এফএকিউ (সম্ভবত ফ্যাক্স.অর্গ.এর উপর) সম্ভবত একটি (অনেক) উত্তরের একটিতে "./*" ওভার "*" এর সুবিধা উপস্থিত রয়েছে। প্রথমদিকে, এটি আরএম-আইএন ফাইলগুলি দিয়ে শুরু হওয়া প্রশ্নে রয়েছে in a "-")।
অলিভিয়ার ডুলাক

… এবং তাদের নামে নতুন লাইন এবং ট্যাবযুক্ত ফাইল থাকা খারাপ অভ্যাস নয় ? আমি জানি আমি নামগুলিতে সীমাবদ্ধ করার চেষ্টা করি[a-z0-9.+-]
ব্ল্যাকলাইট জ্বলজ্বল

5
@ ব্ল্যাকলাইটশাইনিং, গাড়ি চুরি করা খুব খারাপ , তবে আপনার গাড়িটি আনলক করা (নতুন লাইনগুলি উপেক্ষা করুন) রেখে দেওয়া খারাপ , বিশেষত যখন এটি একটি ব্যয়বহুল গাড়ী (কোনও বিশেষাধিকারী ব্যবহারকারী হিসাবে স্ক্রিপ্ট সংবেদনশীল ডেটা সহ সার্ভারে চলমান ...) বা আপনি যখন করেন এটিকে কোনও রুক্ষ অঞ্চল ( /tmp) বা প্রচুর ব্যয়বহুল গাড়ি ( $HOME) দিয়ে পার্ক করুন এবং কোনও প্রশ্নোত্তর সাইটে যেতে আরও খারাপ বলা হয়েছে যে কোন অবস্থাতে (লকড গ্যারেজে, স্ক্রিপ্টে) উল্লেখ না করে আপনার গাড়ি লক না করা সর্বদা ভাল fine আপনি নিজের দ্বারা চালিত লিখেছেন কেবল কোনও মেশিনে যা কোনও নেটওয়ার্ক বা অপসারণযোগ্য স্টোরেজ সংযুক্ত নয় ...)
স্টাফেন চেজেলাস

1
@ ব্ল্যাকলাইটশাইনিং, নিউলাইনগুলি অস্বাভাবিক তবে এম্বেড থাকা স্পেসগুলি আজকাল খুব সাধারণ, বিশেষত জিইউআইয়ের মাধ্যমে নির্মিত ফাইলগুলির জন্য।
অ্যালেক্সিস

2
@ ব্ল্যাকলাইটশাইনিং, হ্যাঁ যদিও এটির (যেমন "b "বা "a\bb") টার্মিনালে কোনও ব্যবহারকারীকে বোকা বানাবে তবে স্ক্রিপ্টের আউটপুটকে বিশ্লেষণ করে না du ./*। আমার সম্ভবত এটি সম্পর্কে একটি নোট যোগ করা উচিত। আগামীকাল করবে। নোট করুন যে এর আগে আমি সাধারণ অর্থে বিশেষাধিকার পেয়েছিলাম, না root(যদিও rootঅবশ্যই এটি আরও বেশি ক্ষেত্রে প্রযোজ্য )। নতুন লাইনের অনুমতি রয়েছে, এগুলি এড়ানো একটি বাগ। বাগের শোষণ করার অভ্যাস রয়েছে। কেস ভিত্তিতে আপনি কেসটিতে ঝুঁকিটি পরিমাপ করতে পারবেন। ভাল কোডিং অনুশীলন অনেক ক্ষেত্রে সমস্যা এড়াতে পারে। অবশ্যই এসই তে আমাদের সচেতনতা বাড়ানো উচিত।
স্টাফেন চেজেলাস 26'14

6

কোনটি ফাইলগুলি তালিকাভুক্ত করবে তার ক্ষেত্রে *এবং এর ./*মধ্যে কোনও পার্থক্য নেই । পার্থক্যটি ২ য় ফর্মের সাথেই হবে, প্রতিটি ফাইলের ./সামনে একটি ডট স্ল্যাশ থাকবে যার অর্থ সাধারণত বর্তমান ডিরেক্টরি।

মনে রাখবেন যে .ডিরেক্টরিটি বর্তমান ডিরেক্টরিটির জন্য একটি শর্টহ্যান্ড স্বরলিপি।

$ ls -la | head -4
total 28864
drwx------. 104 saml saml    12288 Jan 23 20:04 .
drwxr-xr-x.   4 root root     4096 Jul  8  2013 ..
-rw-rw-r--.   1 saml saml      972 Oct  6 20:26 abcdefg

আপনি নিজেকে বোঝাতে পারেন যে এই 2 টি তালিকা echoশেলটি কীভাবে তাদের প্রসারিত করবে তা ব্যবহার করে মূলত একই জিনিস ।

$ echo *
$ echo ./*

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

উদাহরণ

আমরা এর মতো কিছু জাল তথ্য তৈরি করতে পারি:

$ touch file{1..5}
$ ll
total 0
-rw-rw-r--. 1 saml saml 0 Jan 24 07:14 file1
-rw-rw-r--. 1 saml saml 0 Jan 24 07:14 file2
-rw-rw-r--. 1 saml saml 0 Jan 24 07:14 file3
-rw-rw-r--. 1 saml saml 0 Jan 24 07:14 file4
-rw-rw-r--. 1 saml saml 0 Jan 24 07:14 file5

এখন যখন আমরা উপরের echoকমান্ডগুলি ব্যবহার করি আমরা নিম্নলিখিত আউটপুটটি দেখতে পাই:

$ echo *
file1 file2 file3 file4 file5
$ echo ./*
./file1 ./file2 ./file3 ./file4 ./file5

এই পার্থক্যটি অপ্রয়োজনীয় বলে মনে হতে পারে তবে এমন পরিস্থিতিতে রয়েছে যেখানে আপনি বিভিন্ন ইউনিক্স কমান্ড লাইন সরঞ্জামগুলির গ্যারান্টি দিতে চান যে আপনি কমান্ড লাইনের মাধ্যমে ফাইলের নাম তাদের কাছে পাঠিয়ে দিচ্ছেন, এবং আরও কিছু নেই!

তাহলে কেন ./* ব্যবহার করবেন?

@ স্টিফেনের উত্তরটি যেমন উল্লেখ করেছে , ইউনিক্সে ফাইল এবং ডিরেক্টরিগুলির নামকরণ করার সময় কোন চরিত্রগুলি আইনী তা বৈধতার প্রকৃতির কারণে, বিপজ্জনক ফাইলের নামগুলি তৈরি করা যেতে পারে যা কমান্ড লাইনে বিভিন্ন ইউনিক্স কমান্ডে পৌঁছে গেলে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হয়।

তাই প্রায়শই ব্যবহারের ব্যবহারটি ./গ্যারান্টি সাহায্য করতে ব্যবহৃত হয় যে বিস্তৃত ফাইলের নামগুলি ফাইলের নাম হিসাবে বিবেচিত হবে যখন বিভিন্ন ইউনিক্স কমান্ডের সাথে যুক্তি হিসাবে প্রেরণ করা হয়।

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