উত্তর:
$ টাচ ./-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
নিখোঁজ।
GNU
Ls এর মতো কিছু সরঞ্জাম প্রিন্টযোগ্য অক্ষরগুলিকে প্রশ্ন চিহ্নের সাথে প্রতিস্থাপন করবে (নোট করুন ∕
(ইউ + 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
হার্ড লিঙ্কগুলি তালিকাবদ্ধ থাকলেও সমস্ত বাস্তবায়ন এ জাতীয় আচরণ করে না কমান্ড লাইনে)।
[a-z0-9.+-]
।
/tmp
) বা প্রচুর ব্যয়বহুল গাড়ি ( $HOME
) দিয়ে পার্ক করুন এবং কোনও প্রশ্নোত্তর সাইটে যেতে আরও খারাপ বলা হয়েছে যে কোন অবস্থাতে (লকড গ্যারেজে, স্ক্রিপ্টে) উল্লেখ না করে আপনার গাড়ি লক না করা সর্বদা ভাল fine আপনি নিজের দ্বারা চালিত লিখেছেন কেবল কোনও মেশিনে যা কোনও নেটওয়ার্ক বা অপসারণযোগ্য স্টোরেজ সংযুক্ত নয় ...)
"b "
বা "a\bb"
) টার্মিনালে কোনও ব্যবহারকারীকে বোকা বানাবে তবে স্ক্রিপ্টের আউটপুটকে বিশ্লেষণ করে না du ./*
। আমার সম্ভবত এটি সম্পর্কে একটি নোট যোগ করা উচিত। আগামীকাল করবে। নোট করুন যে এর আগে আমি সাধারণ অর্থে বিশেষাধিকার পেয়েছিলাম, না root
(যদিও root
অবশ্যই এটি আরও বেশি ক্ষেত্রে প্রযোজ্য )। নতুন লাইনের অনুমতি রয়েছে, এগুলি এড়ানো একটি বাগ। বাগের শোষণ করার অভ্যাস রয়েছে। কেস ভিত্তিতে আপনি কেসটিতে ঝুঁকিটি পরিমাপ করতে পারবেন। ভাল কোডিং অনুশীলন অনেক ক্ষেত্রে সমস্যা এড়াতে পারে। অবশ্যই এসই তে আমাদের সচেতনতা বাড়ানো উচিত।
কোনটি ফাইলগুলি তালিকাভুক্ত করবে তার ক্ষেত্রে *
এবং এর ./*
মধ্যে কোনও পার্থক্য নেই । পার্থক্যটি ২ য় ফর্মের সাথেই হবে, প্রতিটি ফাইলের ./
সামনে একটি ডট স্ল্যাশ থাকবে যার অর্থ সাধারণত বর্তমান ডিরেক্টরি।
মনে রাখবেন যে .
ডিরেক্টরিটি বর্তমান ডিরেক্টরিটির জন্য একটি শর্টহ্যান্ড স্বরলিপি।
$ 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
এই পার্থক্যটি অপ্রয়োজনীয় বলে মনে হতে পারে তবে এমন পরিস্থিতিতে রয়েছে যেখানে আপনি বিভিন্ন ইউনিক্স কমান্ড লাইন সরঞ্জামগুলির গ্যারান্টি দিতে চান যে আপনি কমান্ড লাইনের মাধ্যমে ফাইলের নাম তাদের কাছে পাঠিয়ে দিচ্ছেন, এবং আরও কিছু নেই!
@ স্টিফেনের উত্তরটি যেমন উল্লেখ করেছে , ইউনিক্সে ফাইল এবং ডিরেক্টরিগুলির নামকরণ করার সময় কোন চরিত্রগুলি আইনী তা বৈধতার প্রকৃতির কারণে, বিপজ্জনক ফাইলের নামগুলি তৈরি করা যেতে পারে যা কমান্ড লাইনে বিভিন্ন ইউনিক্স কমান্ডে পৌঁছে গেলে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হয়।
তাই প্রায়শই ব্যবহারের ব্যবহারটি ./
গ্যারান্টি সাহায্য করতে ব্যবহৃত হয় যে বিস্তৃত ফাইলের নামগুলি ফাইলের নাম হিসাবে বিবেচিত হবে যখন বিভিন্ন ইউনিক্স কমান্ডের সাথে যুক্তি হিসাবে প্রেরণ করা হয়।