কেন * পার্স করা (এবং পরিবর্তে কী করা উচিত)?


204

আমি ধারাবাহিকভাবে উত্তর উদ্ধৃত দেখতে এই লিঙ্কে নিশ্চিতভাবেই জানায় "পার্স না ls!" এটি বেশ কয়েকটি কারণে আমাকে বিরক্ত করে:

  1. দেখে মনে হচ্ছে যে এই লিঙ্কটিতে থাকা তথ্যগুলি খুব কম প্রশ্ন সহ পাইকারিভাবে গ্রহণ করা হয়েছে, যদিও আমি নৈমিত্তিক পড়ার ক্ষেত্রে কমপক্ষে কয়েকটি ত্রুটি বাছাই করতে পারি।

  2. এটিও মনে হয় যেন সেই লিঙ্কে বর্ণিত সমস্যাগুলি সমাধানের সন্ধান করার কোনও ইচ্ছা পোষণ করে না।

প্রথম অনুচ্ছেদ থেকে:

... আপনি যখন [ls]ফাইলগুলির তালিকার জন্য জিজ্ঞাসা করবেন তখন একটি বিশাল সমস্যা রয়েছে: ইউনিক্স কোনও সাদা নাম, নিউলাইনস, কমা, পাইপ প্রতীক এবং অন্য যে কোনও কিছুতে আপনি কখনও চেষ্টা করতে চাইলে ফাইলের প্রায় কোনও চরিত্রের অনুমতি দেন allows NUL ব্যতীত ডিলিমিটার ... lsফাইলের নামগুলি নতুন লাইনের সাথে পৃথক করে। আপনার কাছে নতুন নামে একটি ফাইল না হওয়া পর্যন্ত এটি ঠিক আছে। এবং যেহেতু আমি এর কোনও প্রয়োগের কথা জানি না তাই lsআপনাকে নিউলাইনের পরিবর্তে NUL টি অক্ষরের সাথে ফাইলের নাম শেষ করতে দেয়, এটি আমাদের নিরাপদে ফাইল নামগুলির একটি তালিকা পেতে অক্ষম করে ls

বামার, তাই না? কিভাবে কি কখনো আমরা একটি newline ডেটা রয়েছে যা নতুন লাইন থাকতে পারে জন্য তালিকাভুক্ত ডেটা সেটটি সমাপ্ত সামলাতে পারবে? ঠিক আছে, যদি এই ওয়েবসাইটে প্রশ্নের উত্তর দেওয়া লোকেরা প্রতিদিন ভিত্তিতে এই ধরণের জিনিস না করে তবে আমি ভাবতে পারি যে আমরা কোনও সমস্যায় পড়েছি।

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

LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 02:27 ^@new$
line$
file^@^@^@$
^@

দেখুন এই আরো অনেক কিছুর জন্য।

এখন এটি এই নিবন্ধটির পরবর্তী অংশ যা সত্যই আমাকে পেয়েছে:

$ ls -l
total 8
-rw-r-----  1 lhunath  lhunath  19 Mar 27 10:47 a
-rw-r-----  1 lhunath  lhunath   0 Mar 27 10:47 a?newline
-rw-r-----  1 lhunath  lhunath   0 Mar 27 10:47 a space

সমস্যাটি হ'ল আউটপুট থেকে ls, আপনি বা কম্পিউটার উভয়ই বলতে পারবেন না যে এর কোন অংশগুলি ফাইলের নাম গঠন করে। এটি কি প্রতিটি শব্দ? না এটি প্রতিটি লাইন? না। এই প্রশ্নের সঠিক কোনও উত্তর নেই: আপনি বলতে পারবেন না।

এছাড়াও খেয়াল করুন যে কীভাবে lsআপনার ফাইলের নাম ডেটা গার্বল করে (আমাদের ক্ষেত্রে এটি "ক" এবং "নিউলাইন"\n শব্দের মাঝে চরিত্রটিকে একটি প্রশ্ন প্রশ্নে রূপান্তরিত করে ...

...

আপনি যদি কেবল বর্তমান ডিরেক্টরিটিতে থাকা সমস্ত ফাইলের পুনরাবৃত্তি করতে চান তবে একটি forলুপ এবং একটি গ্লোব ব্যবহার করুন:

for f in *; do
    [[ -e $f ]] || continue
    ...
done

লেখক এটা কল ফাইলের নামের garbling যখন lsশেল globs ধারণকারী ফাইলের নামের একটি তালিকা ফেরৎ এবং তারপর একটি শেল উল্লিখিত glob ব্যবহার করার পরামর্শ একটি ফাইল তালিকা উদ্ধার করুন!

নিম্নোক্ত বিবেচনা কর:

printf 'touch ./"%b"\n' "file\nname" "f i l e n a m e" |
    . /dev/stdin
ls -1q

f i l e n a m e  
file?name

IFS="
" ; printf "'%s'\n" $(ls -1q)

'f i l e n a m e'
'file
name'

পসিক্স সংজ্ঞা দেয় -1এবং -q lsঅপারেশনগুলি তাই:

-q- মুদ্রণযোগ্য ফাইল নাম অক্ষরের প্রতিটি উদাহরণকে <tab>প্রশ্ন-চিহ্ন ( '?') অক্ষর হিসাবে লিখতে বাধ্য করুন । ফলাফল যদি ডিফল্টরূপে এই বিকল্পটি সরবরাহ করতে পারে যদি আউটপুট কোনও টার্মিনাল ডিভাইসে থাকে।

-1- (সংখ্যার অঙ্কের এক।) আউটপুটকে প্রতি লাইনে একটি করে প্রবেশ করতে বাধ্য করুন।

- Globbing নিজস্ব সমস্যা ছাড়াই নয় ?ম্যাচ কোনো চরিত্র তাই একাধিক ম্যাচিং ?একটি তালিকা ফলাফল একই ফাইল একাধিক বার ম্যাচ হবে। এটি সহজেই পরিচালনা করা হয়।

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

তবে কেন চেষ্টাও করবেন? স্বীকার করা, আমার প্রাথমিক অনুপ্রেরণা ছিল যে অন্যরা আমাকে বলতে থাকে যে আমি পারছি না। আমি খুব ভাল জানি যে lsআউটপুটটি যতটা নিয়মিত এবং অনুমানযোগ্য ততক্ষণ আপনি এটির ইচ্ছা করতে পারতেন যতক্ষণ আপনি কী সন্ধান করবেন তা জানেন। ভুল তথ্য আমাকে বেশিরভাগ কাজ করার চেয়ে বেশি বিরক্ত করে।

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

দয়া করে মনে রাখবেন প্যাট্রিক উত্তর এর অসঙ্গত ফলাফল বেশিরভাগই ব্যবহার তাকে ফলে zshতারপর bashzsh- ডিফল্টরূপে - শব্দ-বিভক্ত $(কমান্ড )পোর্টেবল পদ্ধতিতে ফলাফল প্রতিস্থাপন করে না । সুতরাং তিনি যখন জিজ্ঞাসা করলেন বাকী ফাইলগুলি কোথায় গেল? এই প্রশ্নের উত্তর হ'ল আপনার শেল সেগুলি খেয়েছে। এজন্য আপনাকে পোর্টেবল শেল কোড SH_WORD_SPLITব্যবহার zshএবং ডিল করার সময় ভেরিয়েবল সেট করতে হবে । আমি তার উত্তরে এটি নোট করতে ব্যর্থতা ভয়াবহ বিভ্রান্তিকর হিসাবে বিবেচনা করি।

Wumpus এর উত্তর আমার জন্য গনা না - একটি তালিকা প্রেক্ষাপটে ?চরিত্র হল একটি শেল উল্লিখিত glob। আর কীভাবে বলব জানি না।

একাধিক ফলাফলের মামলা পরিচালনা করতে আপনাকে গ্লোবটির লোভকে সীমাবদ্ধ করতে হবে। নিম্নলিখিতটি কেবলমাত্র ভয়াবহ ফাইল নামের একটি পরীক্ষার ভিত্তি তৈরি করবে এবং এটি আপনার জন্য প্রদর্শন করবে:

{ printf %b $(printf \\%04o `seq 0 127`) |
sed "/[^[-b]*/s///g
        s/\(.\)\(.\)/touch '?\v\2' '\1\t\2' '\1\n\2'\n/g" |
. /dev/stdin

echo '`ls` ?QUOTED `-m` COMMA,SEP'
ls -qm
echo ; echo 'NOW LITERAL - COMMA,SEP'
ls -m | cat
( set -- * ; printf "\nFILE COUNT: %s\n" $# )
}

আউটপুট

`ls` ?QUOTED `-m` COMMA,SEP
??\, ??^, ??`, ??b, [?\, [?\, ]?^, ]?^, _?`, _?`, a?b, a?b

NOW LITERAL - COMMA,SEP
?
 \, ?
     ^, ?
         `, ?
             b, [       \, [
\, ]    ^, ]
^, _    `, _
`, a    b, a
b

FILE COUNT: 12

এখন আমি হবে নিরাপদ প্রতিটি ভাষার প্রতিটি অক্ষরের একটি নয় /slash, -dash, :colon, অথবা আলফা-সাংখ্যিক শেল উল্লিখিত glob তারপর চরিত্র sort -uঅনন্য ফলাফলের জন্য তালিকা। এটি নিরাপদ কারণ lsইতিমধ্যে আমাদের জন্য কোনও মুদ্রণযোগ্য অক্ষর সংরক্ষণ করেছে। ঘড়ি:

for f in $(
        ls -1q |
        sed 's|[^-:/[:alnum:]]|[!-\\:[:alnum:]]|g' |
        sort -u | {
                echo 'PRE-GLOB:' >&2
                tee /dev/fd/2
                printf '\nPOST-GLOB:\n' >&2
        }
) ; do
        printf "FILE #$((i=i+1)): '%s'\n" "$f"
done

আউটপুট:

PRE-GLOB:
[!-\:[:alnum:]][!-\:[:alnum:]][!-\:[:alnum:]]
[!-\:[:alnum:]][!-\:[:alnum:]]b
a[!-\:[:alnum:]]b

POST-GLOB:
FILE #1: '?
           \'
FILE #2: '?
           ^'
FILE #3: '?
           `'
FILE #4: '[     \'
FILE #5: '[
\'
FILE #6: ']     ^'
FILE #7: ']
^'
FILE #8: '_     `'
FILE #9: '_
`'
FILE #10: '?
            b'
FILE #11: 'a    b'
FILE #12: 'a
b'

নীচে আমি আবার সমস্যার দিকে এগিয়ে যাই তবে আমি আলাদা পদ্ধতি ব্যবহার করি। মনে রাখবেন - \0নাল ছাড়াও - /ASCII চরিত্রটি একমাত্র নামের নামের মধ্যে নিষিদ্ধ। আমি এখানে গ্লোবগুলি একপাশে রেখেছি এবং এর পরিবর্তে POSIX নির্দিষ্ট -dবিকল্প lsএবং এর জন্য POSIX নির্দিষ্ট -exec $cmd {} +কন্সট্রাক্ট সংযুক্ত করি find। যেহেতু findকেবলমাত্র প্রাকৃতিকভাবেই /ক্রমানুসারে একটিকে নির্গত করবে , নীচে সহজেই প্রতিটি প্রবেশের জন্য সমস্ত দন্ত সংক্রান্ত তথ্য সহ একটি পুনরাবৃত্ত এবং নির্ভরযোগ্যভাবে বিস্মৃত ফাইললিস্ট সংগ্রহ করা হয়। আপনি এই জাতীয় কিছু দিয়ে কী করতে পারেন তা কল্পনা করুন:

#v#note: to do this fully portably substitute an actual newline \#v#
#v#for 'n' for the first sed invocation#v#
cd ..
find ././ -exec ls -1ldin {} + |
sed -e '\| *\./\./|{s||\n.///|;i///' -e \} |
sed 'N;s|\(\n\)///|///\1|;$s|$|///|;P;D'

###OUTPUT

152398 drwxr-xr-x 1 1000 1000        72 Jun 24 14:49
.///testls///

152399 -rw-r--r-- 1 1000 1000         0 Jun 24 14:49
.///testls/?
            \///

152402 -rw-r--r-- 1 1000 1000         0 Jun 24 14:49
.///testls/?
            ^///

152405 -rw-r--r-- 1 1000 1000         0 Jun 24 14:49
.///testls/?
        `///
...

ls -i খুব কার্যকর হতে পারে - বিশেষত যখন ফলাফলের স্বতন্ত্রতা প্রশ্নে আসে।

ls -1iq | 
sed '/ .*/s///;s/^/-inum /;$!s/$/ -o /' | 
tr -d '\n' | 
xargs find

এগুলি কেবলমাত্র সবচেয়ে পোর্টেবল উপায় যা আমি ভাবতে পারি। জিএনইউ দিয়ে lsআপনি করতে পারেন:

ls --quoting-style=WORD

এবং শেষ, এখান থেকে অনেক বেশী সাদাসিধে পদ্ধতি পার্সিংls যে আমি inode সংখ্যার প্রয়োজন যখন বেশ প্রায়ই ব্যবহার ঘটতে:

ls -1iq | grep -o '^ *[0-9]*'

এটি কেবল ইনড নম্বরগুলি দেয় - যা অন্য একটি কার্যকর পসিক্স নির্দিষ্ট বিকল্প।


12
@ মাইকজারভ ঠিক আছে আমি করেছি। শেল গ্লোবটি 2.48 গুণ বেশি গতিযুক্ত। time bash -c 'for i in {1..1000}; do ls -R &>/dev/null; done'= 3.18s বনাম time bash -c 'for i in {1..1000}; do echo **/* >/dev/null; done'= 1.28s
প্যাট্রিক

28
আপনার অতি সাম্প্রতিক আপডেটের ক্ষেত্রে, আপনার কোডটি কাজ করে তা নির্ধারণ করে ভিজ্যুয়াল আউটপুটে নির্ভর করা বন্ধ করুন। আপনার ফলাফলটি একটি আসল প্রোগ্রামে পাস করুন এবং প্রোগ্রামটি চেষ্টা করুন এবং ফাইলটিতে একটি ক্রিয়াকলাপ করুন। এই কারণেই আমি statআমার উত্তরটি ব্যবহার করছিলাম কারণ এটি প্রতিটি ফাইলের উপস্থিতি যাচাই করে। sedজিনিসটির সাথে নীচে আপনার বিট কাজ করে না।
প্যাট্রিক

57
আপনি গুরুতর হতে পারবেন না। আপনার প্রশ্নের বর্ণনা করা সমস্ত হুপগুলিতে কীভাবে ঝাঁপ দেওয়া সহজ বা সরল বা কোনওভাবে lsপ্রথম স্থানটি বিশ্লেষণ না করার চেয়ে ভাল হতে পারে ? আপনি যা বর্ণনা করছেন তা খুব শক্ত। এগুলি সব বোঝার জন্য আমার এটি ডিকনস্ট্রাক্ট করতে হবে এবং আমি তুলনামূলকভাবে সক্ষম ব্যবহারকারী। আপনি সম্ভবত আপনার গড় জো এ জাতীয় কিছু মোকাবেলা করতে সক্ষম হতে পারবেন না।
টেরডন

46
একটি যুক্তি বাছাই করতে একটি প্রশ্ন ব্যবহার করার জন্য -1। lsআউটপুট পার্সিংয়ের যে কারণে ভুল হয়েছে তার সবগুলিই মূল লিঙ্কটিতে ভালভাবে কভার করা হয়েছিল (এবং অন্যান্য জায়গাগুলিতে প্রচুর পরিমাণে)। এই প্রশ্নটি যদি ওপি বুঝতে সাহায্যের জন্য জিজ্ঞাসা করত তবে এই প্রশ্নটি যুক্তিসঙ্গত হত, তবে পরিবর্তে ওপি তার ভুল ব্যবহার ঠিক আছে তা প্রমাণ করার চেষ্টা করছে।
আর ..

14
@mikeserv এটা ঠিক যে না parsing ls is bad। এরকম for something in $(command)এবং সঠিক ফলাফল পেতে শব্দ-বিভাজন উপর নির্ভর বৃহৎ সংখ্যাগরিষ্ঠ জন্য খারাপ command'sযা সহজ আউটপুট হবে না।
ব্রোস্লো

উত্তর:


184

আমি এ সব এই প্রতীত নই, কিন্তু এর যুক্তি অনুরোধে যে আপনার জন্য অনুমান করা যাক পারে , যদি আপনি যথেষ্ট প্রচেষ্টা করা প্রস্তুত হন, আউটপুট পার্স lsনির্ভরযোগ্যভাবে, এমনকি একটি "প্রতিদ্বন্দ্বী" মুখে - কেউ আপনি যে কোডটি লিখেছেন তা জানেন এবং ইচ্ছাকৃতভাবে এটির জন্য ডিজাইন করা ফাইলের নামগুলি বেছে নিচ্ছেন।

এমনকি যদি আপনি এটি করতে পারতেন তবে এটি একটি খারাপ ধারণা হবে

বোর্ন শেল ভাল ভাষা নয়। এটি জটিল কোনও কিছুর জন্য ব্যবহার করা উচিত নয়, যদি না চূড়ান্ত বহনযোগ্যতা অন্য কোনও ফ্যাক্টরের (যেমন autoconf) এর চেয়ে বেশি গুরুত্বপূর্ণ না হয় ।

আমি দাবি করি যে আপনি যদি কোনও সমস্যার মুখোমুখি হয়ে থাকেন যেখানে আউটপুটকে পার্স করা lsশেল স্ক্রিপ্টের জন্য ন্যূনতম প্রতিরোধের পথের মতো মনে হয়, তবে এটি একটি শক্তিশালী ইঙ্গিত যে আপনি যা কিছু করছেন তা শেলের জন্য খুব জটিল এবং আপনার পুরো জিনিসটি আবার লিখতে হবে পার্ল বা পাইথন। পাইথনে আপনার শেষ প্রোগ্রামটি এখানে:

import os, sys
for subdir, dirs, files in os.walk("."):
    for f in dirs + files:
      ino = os.lstat(os.path.join(subdir, f)).st_ino
      sys.stdout.write("%d %s %s\n" % (ino, subdir, f))

ফাইলের নামগুলিতে অস্বাভাবিক চরিত্রগুলির সাথে এটির কোনও সমস্যা নেই - আউটপুটটি একইভাবে আউটপুট lsদ্বিপাক্ষিক, তবে এটি কোনও "আসল" প্রোগ্রামে গুরুত্বপূর্ণ হবে না (যেমন একটি ডেমোর বিপরীতে), যা os.path.join(subdir, f)সরাসরি ফলাফল ব্যবহার করুন ।

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

import os, sys
filelist = []
for subdir, dirs, files in os.walk("."):
    for f in dirs + files:
        if f[0] == '.' or f[-1] == '~': continue
        lstat = os.lstat(os.path.join(subdir, f))
        filelist.append((f, subdir, lstat.st_ino))

filelist.sort(key = lambda x: x[0])
for f, subdir, ino in filelist: 
   sys.stdout.write("%d %s %s\n" % (ino, subdir, f))

5
এটা ভাল. এটি কি for in | for inপুনরাবৃত্তির কথা বলে? আমি নিশ্চিত নই. এমনকি যদি এটি একাধিক হতে পারে না, তাই না? এটি এখনও পর্যন্ত আমার কাছে বোধগম্য একমাত্র উত্তর।
মাইকজার্ভ

10
কোনও পুনরাবৃত্তি নয়, কেবল নেস্টেড- forলুপস। os.walkপর্দার আড়ালে কিছু গুরুতর ভারী উত্তোলন করছে, তবে অভ্যন্তরীণভাবে কীভাবে lsবা কীভাবে findকাজ করবে সে সম্পর্কে আপনাকে আর উদ্বিগ্ন হওয়ার দরকার নেই ।
zwol

6
প্রযুক্তিগতভাবে, os.walkএকটি জেনারেটর বস্তু প্রদান করে । জেনারেটর অলস তালিকার পাইথনের সংস্করণ। প্রতিবার বাহিরের জন্য-লুপটি পুনরাবৃত্তি করে, জেনারেটরটি আহ্বান করা হয় এবং অন্য উপ-ডিরেক্টরিটির বিষয়বস্তুগুলি "ফলন" দেয়। পার্লের সমতুল্য কার্যকারিতা File::Findযদি তা সাহায্য করে helps
zwol

6
আপনার সচেতন হওয়া উচিত যে আমি যে নথির সমালোচনা করছি তার সাথে এবং প্যাট্রিক এবং টার্ডনের উত্তরগুলির সাথে আমি 100% সম্মত। আমার উত্তরটি আউটপুট পার্সিং এড়ানোর জন্য একটি অতিরিক্ত , স্বতন্ত্র কারণ সরবরাহ করার উদ্দেশ্য ছিল ls
zwol

19
এটি খুব বিভ্রান্তিকর। শেল একটি ভাল প্রোগ্রামিং ভাষা নয়, তবে কেবল এটি কোনও প্রোগ্রামিং ভাষা নয়। এটি একটি স্ক্রিপ্টিং ভাষা। এবং এটি একটি ভাল স্ক্রিপ্টিং ভাষা।
মাইলস রাউট

178

তথ্যটি সম্পূর্ণ নির্ভুল হওয়ায় এই লিঙ্কটি অনেকগুলি রেফারেন্স করা হয়েছে এবং এটি খুব দীর্ঘ সময় ধরে রয়েছে।


lsমুদ্রণযোগ্য অক্ষরগুলি গ্লোব অক্ষরগুলির সাথে প্রতিস্থাপন করে হ্যাঁ, তবে এই অক্ষরগুলি প্রকৃত ফাইলের নামগুলিতে নয়। কেন এই ব্যাপার? ২ টি কারণ:

  1. আপনি যদি কোনও প্রোগ্রামে সেই ফাইল নামটি পাস করেন তবে সেই ফাইলের নামটি বিদ্যমান নেই। আসল ফাইলের নাম পেতে এটি বিশ্বকে প্রসারিত করতে হবে।
  2. ফাইল গ্লোব একাধিক ফাইলের সাথে মেলে।

উদাহরণ স্বরূপ:

$ touch a$'\t'b
$ touch a$'\n'b
$ ls -1
a?b
a?b

লক্ষ্য করুন আমাদের কাছে কীভাবে দুটি ফাইল রয়েছে যা দেখতে দেখতে একই রকম। যদি উভয়কেই প্রতিনিধিত্ব করা হয় তবে আপনি কীভাবে তাদের আলাদা করতে যাচ্ছেন a?b?


এলএস যখন শেল গ্লোবযুক্ত ফাইলের একটি তালিকা ফেরত দেয় এবং কোনও ফাইল তালিকা পুনরুদ্ধার করতে শেল গ্লোব ব্যবহার করার পরামর্শ দেয় তখন লেখক এটিকে গার্লিং ফাইলের নামগুলি বলে!

এখানে একটি পার্থক্য আছে। যখন আপনি কোনও গ্লোব ফিরে পেয়েছেন, যেমন প্রদর্শিত হবে, সেই গ্লোব একাধিক ফাইলের সাথে মেলে। যাইহোক আপনি যখন কোনও গ্লোবের সাথে মিল রেখে ফলাফলগুলি পুনরাবৃত্তি করেন, আপনি কোনও গ্লোব নয়, সঠিক ফাইলটি ফিরে পাবেন।

উদাহরণ স্বরূপ:

$ for file in *; do printf '%s' "$file" | xxd; done
0000000: 6109 62                                  a.b
0000000: 610a 62                                  a.b

লক্ষ্য করুন xxdআউটপুট কীভাবে দেখায় $fileএতে কাঁচা অক্ষর রয়েছে \tএবং \nনা ?

আপনি যদি ব্যবহার করেন তবে lsপরিবর্তে এটি পাবেন:

for file in $(ls -1q); do printf '%s' "$file" | xxd; done
0000000: 613f 62                                  a?b
0000000: 613f 62                                  a?b

"আমি যাইহোক পুনরাবৃত্তি করতে যাচ্ছি, কেন ব্যবহার lsকরবেন না ?"

আপনার দেওয়া উদাহরণটি বাস্তবে কার্যকর হয় না। দেখে মনে হচ্ছে এটি কাজ করে তবে তা হয় না।

আমি এটি উল্লেখ করছি:

 for f in $(ls -1q | tr " " "?") ; do [ -f "$f" ] && echo "./$f" ; done

আমি গুচ্ছ ফাইলের নামের সাথে একটি ডিরেক্টরি তৈরি করেছি:

$ for file in *; do printf '%s' "$file" | xxd; done
0000000: 6120 62                                  a b
0000000: 6120 2062                                a  b
0000000: 61e2 8082 62                             a...b
0000000: 61e2 8083 62                             a...b
0000000: 6109 62                                  a.b
0000000: 610a 62                                  a.b

আমি যখন আপনার কোডটি চালনা করি তখন আমি এটি পাই:

$ for f in $(ls -1q | tr " " "?") ; do [ -f "$f" ] && echo "./$f" ; done
./ab
./ab

বাকী ফাইলগুলি কোথায় গেল?

পরিবর্তে এটি চেষ্টা করুন:

$ for f in $(ls -1q | tr " " "?") ; do stat --format='%n' "./$f"; done
stat: cannot stat ‘./a?b’: No such file or directory
stat: cannot stat ‘./a??b’: No such file or directory
./ab
./ab
stat: cannot stat ‘./a?b’: No such file or directory
stat: cannot stat ‘./a?b’: No such file or directory

এখন আসল গ্লোব ব্যবহার করতে দিন:

$ for f in *; do stat --format='%n' "./$f"; done
./a b
./a  b
./ab
./ab
./a b
./a
b

বাশ সহ

উপরের উদাহরণটি আমার সাধারণ শেল, zsh এর সাথে ছিল। আমি যখন ব্যাশ দিয়ে প্রক্রিয়াটি পুনরাবৃত্তি করি তখন আমি আপনার উদাহরণের সাথে ফলাফলের আরও একটি সম্পূর্ণ আলাদা সেট পাই:

ফাইলগুলির একই সেট:

$ for file in *; do printf '%s' "$file" | xxd; done
0000000: 6120 62                                  a b
0000000: 6120 2062                                a  b
0000000: 61e2 8082 62                             a...b
0000000: 61e2 8083 62                             a...b
0000000: 6109 62                                  a.b
0000000: 610a 62                                  a.b

আপনার কোড সহ মূলত ভিন্ন ফলাফল:

for f in $(ls -1q | tr " " "?") ; do stat --format='%n' "./$f"; done
./a b
./ab
./ab
./a b
./a
b
./a  b
./ab
./ab
./a b
./ab
./ab
./a b
./a
b
./a b
./ab
./ab
./a b
./a
b

শেল গ্লোব সহ এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে:

$ for f in *; do stat --format='%n' "./$f"; done
./a b
./a  b
./ab
./ab
./a b
./a
b

বাশ এইভাবে আচরণ করার কারণে উত্তরের শুরুতে আমি তৈরি করা পয়েন্টগুলির একটিতে ফিরে যায়: "ফাইল গ্লোব একাধিক ফাইলের সাথে মেলে"।

lsa?bবেশ কয়েকটি ফাইলের জন্য একই গ্লোব ( ) ফিরিয়ে দিচ্ছে , সুতরাং প্রতিবার আমরা এই গ্লোবটি প্রসারিত করার সাথে সাথে এর সাথে মিলে যায় এমন প্রতিটি ফাইল পাই।


আমি যে ফাইলগুলি ব্যবহার করছিলাম তার তালিকা পুনরায় তৈরি করবেন:

touch 'a b' 'a  b' a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b

হেক্স কোডগুলি হ'ল ইউটিএফ -8 এনবিএসপি অক্ষর।


5
@ মাইক্রোজার আসলে তার সমাধানটি গ্লোব ফিরিয়ে দেয় না। আমি কেবলমাত্র আমার পয়েন্টটি পরিষ্কার করতে আমার উত্তর আপডেট করেছি।
প্যাট্রিক

18
"বাকি নেই"? এটি বেমানান আচরণ এবং অপ্রত্যাশিত ফলাফল, কীভাবে এটি একটি কারণ নয়?
প্যাট্রিক

11
@ মাইকজার্ভস আপনি কি আপনার প্রশ্নে আমার মন্তব্য দেখেন নি? শেল গ্লোব্বিং এর তুলনায় 2.5 গুণ বেশি দ্রুত ls। আমি আপনার অনুরোধ করেছিলাম আপনার কোডটি পরীক্ষা না করে কারণ এটি কাজ করে না। এর কোনওটির সাথে zsh এর কী সম্পর্ক রয়েছে?
প্যাট্রিক

27
@ মাইক্রোজার না, এগুলি সব কিছু এমনকি ব্যাশকেও প্রযোজ্য। যদিও আমি যা বলছি তা আপনি শুনছেন না বলে আমি এই প্রশ্নটি দিয়েছি।
প্যাট্রিক

7
আপনি কি জানেন, আমি মনে করি আমি এই উত্তরটিকে সমর্থন করব এবং আমার কাছে পরিষ্কার করব যে আমি যা বলেছি তার সাথে আমি একমত। ;-)
zwol

54

আসুন চেষ্টা করুন এবং কিছুটা সরল করুন:

$ touch a$'\n'b a$'\t'b 'a b'
$ ls
a b  a?b  a?b
$ IFS="
"
$ set -- $(ls -1q | uniq)
$ echo "Total files in shell array: $#"
Total files in shell array: 4

দেখা? ইতিমধ্যে ঠিক সেখানে ভুল। এখানে 3 টি ফাইল রয়েছে তবে ব্যাশ রিপোর্ট করছে 4 এটি কারণ setহ'ল তৈরি করা গ্লোবগুলি দেওয়া হচ্ছে lsযা শেল দ্বারা প্রেরণের আগে প্রসারিত হয় set। আপনি যে কারণে পান:

$ for x ; do
>     printf 'File #%d: %s\n' $((i=$i+1)) "$x"
> done
File #1: a b
File #2: a b
File #3: a    b
File #4: a
b

বা, যদি আপনি পছন্দ করেন:

$ printf ./%s\\0 "$@" |
> od -A n -c -w1 |
> sed -n '/ \{1,3\}/s///;H
> /\\0/{g;s///;s/\n//gp;s/.*//;h}'
./a b
./a b
./a\tb
./a\nb

উপরেরটি চালানো হয়েছিল bash 4.2.45


2
আমি এটি upvated। আপনার নিজের কোড আপনাকে কামড়াতে দেখে ভাল লাগছে। তবে কেবল আমি ভুল হয়ে যাওয়ার অর্থ এই নয় যে এটি সঠিকভাবে করা যায় না। আমি আপনাকে আজ সকালে এটি করার একটি খুব সহজ উপায়টি দেখিয়েছি ls -1qRi | grep -o '^ *[0-9]*'- এটি lsআউটপুট পার্সিং করছে , মানুষ, এবং এটি সবচেয়ে দ্রুত এবং সর্বোত্তম উপায় যার মধ্যে আমি জানি ইনোড সংখ্যার একটি তালিকা পেতে।
মাইকজারভেল

38
@ মিমকিজার: আপনার যদি সময় এবং ধৈর্য থাকে তবে এটি ঠিক করা যেতে পারে । তবে ঘটনাটি হ'ল এটি সহজাত ত্রুটি-প্রবণ। আপনি নিজেই এটি ভুল পেয়েছি। এর গুণাবলী সম্পর্কে তর্ক যখন! এটির বিরুদ্ধে এটি একটি বিশাল ধর্মঘট, যদি লড়াইয়ের জন্যও একজন ব্যক্তি এটি সঠিকভাবে করতে ব্যর্থ হয়। এবং সম্ভাবনাগুলি হ'ল, আপনি সম্ভবত এটি সঠিক হওয়ার আগে সম্ভবত এটি আরও বেশি সময় ব্যয় করবেন। আমি আপনাকে পছন্দ করি না, তবে বেশিরভাগ লোকেরই একই কোডের লাইনের সাথে বয়সের জন্য বেড়ানোর চেয়ে বেশি সময় দেওয়া ভাল।
সিএওও

@ সিএইচও - আমি এর গুণাবলী নিয়ে তর্ক করিনি - আমি এর প্রচারের প্রতিবাদ করেছি।
মাইকজার্ভ

16
@ মিমকিজার: এর বিরুদ্ধে যুক্তিগুলি সুপ্রতিষ্ঠিত এবং ভালভাবে প্রাপ্য। এমনকি আপনি সেগুলি সত্য বলে দেখিয়েছেন।
সিএওও

1
@ সিএইচও - আমি একমত নই একটি মন্ত্র এবং জ্ঞানের মধ্যে একটি সূক্ষ্ম লাইন আছে।
মাইকজার্ভ

50

এর আউটপুট ls -qমোটেও গ্লোব নয়। এর ?অর্থ এটি ব্যবহার করে "এখানে একটি চরিত্র রয়েছে যা সরাসরি প্রদর্শিত হতে পারে না"। গ্লোবগুলির ?অর্থ "এখানে কোনও চরিত্র অনুমোদিত" to

গ্লোবগুলিতে অন্যান্য বিশেষ অক্ষর রয়েছে ( *এবং []কমপক্ষে এবং []জুটির ভিতরে আরও বেশি রয়েছে)। যাদের কেউ পালিয়ে যায়নি ls -q

$ touch x '[x]'
$ ls -1q
[x]
x

আপনি যদি ls -1qআউটপুটটির চিকিত্সা করেন তবে সেখানে গ্লোবগুলির একটি সেট রয়েছে এবং সেগুলি প্রসারিত করুন, কেবলমাত্র আপনি দুবারই পাবেন না x, আপনি [x]পুরোপুরি মিস করবেন । গ্লোব হিসাবে, এটি স্ট্রিং হিসাবে নিজেকে মেলে না।

ls -q আপনার চোখ এবং / অথবা টার্মিনালটিকে ক্রেজিট চরিত্রগুলি থেকে বাঁচানোর জন্য বোঝানো হয়, এমন কোনও উত্পাদন না করে যাতে আপনি শেলকে ফিরিয়ে দিতে পারেন।


42

উত্তরটি সহজ: আপনার বিশেষ ক্ষেত্রে lsকোনও সম্ভাব্য বেনিফিটকে ছাড়িয়ে যেতে হবে। আপনি যদি lsআউটপুট বিশ্লেষণ না করেন তবে এই বিশেষ ক্ষেত্রেগুলি এড়ানো যায় ।

এখানে মন্ত্রটি কখনও ব্যবহারকারী ফাইল সিস্টেমকে বিশ্বাস করে না ( কখনও কখনও ব্যবহারকারীর ইনপুটকে বিশ্বাস করে না )। যদি এমন কোনও পদ্ধতি থাকে যা সর্বদা 100% সুনিশ্চিততার সাথে কাজ করে তবে এটি এমন পদ্ধতি হওয়া উচিত যা আপনি পছন্দ lsকরেন তবে একই রকম হয় তবে কম নিশ্চিততার সাথে। সেগুলি টেরডন এবং প্যাট্রিক দ্বারা বিস্তৃতভাবে প্রচ্ছদিত হওয়ায় আমি প্রযুক্তিগত বিবরণে যাব না । আমি জানি যে lsএকটি গুরুত্বপূর্ণ (এবং সম্ভবত ব্যয়বহুল) লেনদেন যেখানে আমার কাজ / প্রতিপত্তি লাইনে রয়েছে তাতে ব্যবহারের ঝুঁকির কারণে , আমি এমন কোনও সমাধানকে অগ্রাধিকার দেব যা যদি এড়ানো যায় তবে অনিশ্চয়তার গ্রেড নেই any

আমি জানি কিছু লোক নিশ্চিত হওয়ার চেয়ে কিছুটা ঝুঁকি পছন্দ করে তবে আমি একটি বাগ রিপোর্ট দায়ের করেছি


33

লোকেরা কখনই কিছু না বলে বলে তা অগত্যা না কারণ এটি একেবারে ইতিবাচকভাবে সঠিকভাবে করা যায় না। আমরা এটি করতে সক্ষম হতে পারি, তবে এটি আরও জটিল হতে পারে, স্থান বা সময় অনুযায়ী উভয়ই কম দক্ষ। উদাহরণস্বরূপ এটি বলা ঠিক হবে যে "x86 অ্যাসেমব্লিতে কোনও বৃহত ই-বাণিজ্য ব্যাকএন্ড কখনই তৈরি করবেন না"।

এখন হাতে থাকা ইস্যুটির: আপনি যেমনটি প্রদর্শিত হয়েছে আপনি এমন একটি সমাধান তৈরি করতে পারেন যা এলএসকে পার্স করে এবং সঠিক ফলাফল দেয় - সুতরাং নির্ভুলতা কোনও সমস্যা নয়।

এটা কি আরও জটিল? হ্যাঁ, তবে আমরা এটি কোনও সহায়ক ফাংশনের পিছনে লুকিয়ে রাখতে পারি।

দক্ষতা এখন তাই:

স্থান দক্ষতা: আপনার সমাধান uniqসদৃশ ফিল্টার আউট উপর নির্ভর করে , ফলস্বরূপ আমরা আলস্যভাবে ফলাফল উত্পাদন করতে পারে না। সুতরাং উভয় O(1)বনাম। O(n)বা উভয় আছে O(n)

টাইম-দক্ষতা: শ্রেষ্ঠ ক্ষেত্রে uniqএকটি hashmap পদ্ধতির ব্যবহার তাই আমরা এখনও একটি আছে O(n)উপাদানের সংখ্যা মধ্যে অ্যালগরিদম আহৃত , এটা সম্ভবত যদিও O(n log n)

এখন রিয়েল সমস্যা: যদিও আপনার অ্যালগরিদম এখনও খুব খারাপ আমি সত্যিই উপাদান ব্যবহার করতে সতর্কতা অবলম্বন ছিল খুঁজছেন হয় আহৃত এবং এন জন্য উপাদান। কারণ এটি একটি বড় পার্থক্য করে। বলুন যে আপনার কাছে এমন একটি ফাইল রয়েছে \n\nযার ফলশ্রুতিতে বিশ্বব্যাপী ফলাফল তৈরি হবে ??সুতরাং তালিকার প্রতিটি 2 টি অক্ষরের ফাইলের সাথে মেলে। মজাদারভাবে যদি আপনার কাছে অন্য কোনও ফাইল থাকে \n\rযার ফলস্বরূপ ??এবং সমস্ত 2 টি চরিত্রের ফাইলও ফিরে আসে .. দেখুন কোথায় যাচ্ছে? লিনিয়ার আচরণের পরিবর্তে ক্ষতিকারক অবশ্যই "খারাপ রানটাইম আচরণ" হিসাবে যোগ্যতা অর্জন করে .. এটি একটি ব্যবহারিক অ্যালগরিদম এবং যে বিষয়ে আপনি তাত্ত্বিক সিএস জার্নালগুলিতে কাগজপত্র লেখেন তার মধ্যে পার্থক্য।

প্রত্যেকেই উদাহরণ পছন্দ করে? এখানে আমরা যাই। "টেস্ট" নামে একটি ফোল্ডার তৈরি করুন এবং ফোল্ডারটি যেখানে রয়েছে সেই একই ডিরেক্টরিতে এই অজগর স্ক্রিপ্টটি ব্যবহার করুন।

#!/usr/bin/env python3
import itertools
dir = "test/"
filename_length = 3
options = "\a\b\t\n\v\f\r"

for filename in itertools.product(options, repeat=filename_length):
        open(dir + ''.join(filename), "a").close()

কেবল এটিই হ'ল দৈর্ঘ্যের 3 টি পণ্য 7 অক্ষরের জন্য উত্পন্ন করে। উচ্চ বিদ্যালয়ের গণিত আমাদের জানান যে 343 ফাইল হওয়া উচিত। ভাল এটি মুদ্রণের জন্য দ্রুত হওয়া উচিত, তাই আসুন দেখুন:

time for f in *; do stat --format='%n' "./$f" >/dev/null; done
real    0m0.508s
user    0m0.051s
sys 0m0.480s

এখন আসুন আপনার প্রথম সমাধানটি চেষ্টা করুন, কারণ আমি সত্যিই এটি পেতে পারি না

eval set -- $(ls -1qrR ././ | tr ' ' '?' |
sed -e '\|^\(\.\{,1\}\)/\.\(/.*\):|{' -e \
        's//\1\2/;\|/$|!s|.*|&/|;h;s/.*//;b}' -e \
        '/..*/!d;G;s/\(.*\)\n\(.*\)/\2\1/' -e \
        "s/'/'\\\''/g;s/.*/'&'/;s/?/'[\"?\$IFS\"]'/g" |
uniq)

লিনাক্স টাকশাল 16 এ কাজ করার জন্য এখানে জিনিস (যা আমি মনে করি এই পদ্ধতির ব্যবহারের জন্য ভলিউম বলে)।

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

সুতরাং এখন কতক্ষণ না

time for f in $(ls -1q | tr " " "?") ; do stat --format='%n' "./$f" >/dev/null; done

গ্রহণ করা? ভাল আমি সত্যিই জানি না, 343 ^ 343 ফাইলের নামগুলি পরীক্ষা করতে কিছু সময় লাগে - আমি আপনাকে মহাবিশ্বের তাপের মৃত্যুর পরে বলব tell


6
অবশ্যই, অন্য উত্তরের মন্তব্যে যেমন উল্লেখ করা হয়েছে , "... আপনি প্রমাণ করেছেন যে আপনি একটি সমাধান তৈরি করতে পারেন যা এলএসকে পার্স করে এবং সঠিক ফলাফল দেয় ..." আসলে সত্য নয়।
ওয়াইল্ডকার্ড

26

ওপি'র স্থির ইচ্ছাকৃত ঠিকানা

ভূমিকা এবং মূল উত্তর এর যুক্তিপূর্ণ 2015-05-18 আপডেট

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

আচ্ছা ঠিক আছে; আমি মনে করি বরং এটা একটা লজ্জা ছিল যে আমি জিনিসটা কিভাবে এটি শুধু আমার অর্থ ব্যাখ্যা করার চেষ্টা অনেক সময় অতিবাহিত যে প্রশ্ন হিসাবে আমি পুনরায় পড়া। এই প্রশ্নটি "উত্তর দেওয়ার পরিবর্তে" আলোচনার জন্ম দিয়েছে " এবং 18k text পাঠ্যটির মাপসই শেষ হয়েছে (কেবলমাত্র প্রশ্নটির জন্য, এটি পরিষ্কার হতে পারে) যা এমনকি একটি ব্লগ পোস্টের জন্য দীর্ঘ।

তবে স্ট্যাক এক্সচেঞ্জ আপনার সাবানবক্স নয় এবং এটি আপনার ব্লগ নয়। তবে বাস্তবে আপনি এটিকে দু'জনেরই কমপক্ষে ব্যবহার করেছেন। লোকেরা প্রকৃত প্রশ্নের উত্তর না দিয়ে আপনার "টু-পয়েন্ট-আউট" এর উত্তর দেওয়ার জন্য অনেক সময় ব্যয় করেছিল। এই মুহুর্তে আমি প্রশ্নটি আমাদের ফর্ম্যাটটির জন্য উপযুক্ত নয় বলে পতাকাঙ্কিত করব, ओপি স্পষ্টভাবে বলেছে যে এটি এমনকি কোনও প্রশ্ন হওয়ার ইচ্ছাও ছিল না।

এই মুহুর্তে আমি নিশ্চিত নই যে আমার উত্তরটি বিন্দুতে ছিল কি না; সম্ভবত তা নয়, তবে এটি আপনার কয়েকটি প্রশ্নে পরিচালিত হয়েছিল এবং সম্ভবত এটি অন্য কারও পক্ষে দরকারী উত্তর হতে পারে; নতুনরা হৃদয়গ্রাহী হন, একবার আপনি আরও অভিজ্ঞ হয়ে উঠলে "কিছু কখনও" "কখনও কখনও" হন না। :)

একটি সাধারণ নিয়ম হিসাবে...

দয়া করে অবশিষ্ট রুক্ষ প্রান্তটি ক্ষমা করুন; আমি ইতিমধ্যে এটিতে অনেক বেশি সময় ব্যয় করেছি ... সরাসরি ওপিকে উদ্ধৃত করার পরিবর্তে (মূলত উদ্দিষ্ট হিসাবে) আমি সংক্ষিপ্তকরণ এবং প্যারাফ্রেজ চেষ্টা করব।

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

মূল পোস্টটি বিভিন্ন উপায়ে জিজ্ঞাসা করেছিল, কেন বিভিন্ন নিবন্ধগুলি gave lsআউটপুটকে বিশ্লেষণ করবেন না »বা« আপনার কখনই lsআউটপুট পার্স করা উচিত নয় advice ইত্যাদি পরামর্শ দেয়।

ইস্যুটির জন্য আমার প্রস্তাবিত সমাধানটি হ'ল এই ধরণের বক্তব্যের উদাহরণগুলি হ'ল একটি মূর্খতার উদাহরণ, কিছুটা আলাদা উপায়ে শব্দযুক্ত, যাতে একটি নিখুঁত পরিমাণকে একটি আবশ্যকীয় [যেমন, «[কখনই নয়] এক্স with, You [আপনার] সর্বদা Y »,« [কখনও কখনও জেড »] হওয়া উচিত নয়, সাধারণ নিয়ম বা গাইডলাইন হিসাবে ব্যবহৃত হতে হবে, বিশেষত যখন কোনও বিষয়কে সম্পূর্ণ নতুন সত্য হিসাবে চিহ্নিত করার পরিবর্তে কোনও বিষয়কে দেওয়া হয় তখন সেই বক্তব্য গঠন করতে তবুও এই বিবৃতিগুলির আপাত রূপ

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

এবং তখনই কোনও বিশেষজ্ঞ সম্ভবত "দ্য বিধিগুলি" লঙ্ঘন করে জিনিসগুলি বেছে নিতে পারেন। তবে এটি তাদের কোনও "বিধি" কম দেয় না।

এবং তাই, হাতে থাকা বিষয়টির কাছে: আমার মতে, কোনও বিশেষজ্ঞ পুরোপুরি আঘাত না করেই এই নিয়ম লঙ্ঘন করতে সক্ষম হতে পারে, তবে আমি কোনও উপায়ই দেখতে পাচ্ছি না যে আপনি কোনও শিক্ষানবিশকে "কখনও কখনও" বলার ন্যায্যতা প্রমাণ করতে পারেন lsআউটপুট পার্স করা ঠিক আছে , কারণ: এটি নয় । বা, কমপক্ষে, অবশ্যই কোনও নবজাতকের পক্ষে এটি করা ঠিক নয়।

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

নিয়ম, ভাঙা মানে?

এমন কোনও বিষয়ে নিবন্ধ পড়ার সময় যেটি লক্ষ্যবস্তু করা হয়েছে, বা সম্ভবত পড়াশোনা করা হতে পারে, প্রাথমিকভাবে আপনি এই জাতীয় জিনিসগুলি দেখতে পাবেন:

  • "আপনার কখনই এক্স করা উচিত নয় " "
  • "কখনও কিউ করবেন না!"
  • "জেড করবেন না।"
  • "সর্বদা ওয়াই করা উচিত!"
  • "সি, যাই হোক না কেন।"

যদিও এই বিবৃতিগুলি অবশ্যই নিরঙ্কুশ এবং কালজয়ী বিধিগুলি বলছে বলে মনে হচ্ছে, সেগুলি নয়; পরিবর্তে এটি সাধারণ নিয়মাবলী [ওরফে "গাইডলাইনস", "থাম্বের নিয়ম", "বেসিক", ইত্যাদি] বলার একটি উপায় যা কমপক্ষে যুক্তিযুক্তভাবে এই নিবন্ধগুলি পড়তে পারে এমন নতুনদের জন্য তাদের বর্ণনা করার একটি উপযুক্ত উপায়। যাইহোক, কেবল এগুলি বাতিল হিসাবে বর্ণনা করা হয়েছে বলে, নিয়মগুলি অবশ্যই পেশাদার এবং বিশেষজ্ঞদের বেঁধে দেয় না [যারা সম্ভবত এই নিয়মগুলির প্রথমত সংক্ষিপ্তকরণ করেছিলেন, জ্ঞান রেকর্ড করার এবং জ্ঞানকে উত্তীর্ণ করার উপায় হিসাবে যেমন তারা পুনরাবৃত্তি নিয়ে কাজ করেছিলেন। তাদের বিশেষ নৈপুণ্যে সমস্যা।]

এই নিয়মগুলি অবশ্যই প্রকাশ করতে যাচ্ছে না যে কোনও বিশেষজ্ঞ কীভাবে কোনও জটিল বা সংকীর্ণ সমস্যা মোকাবেলা করবেন, যেখানে বলা হয়েছে যে, এই বিধিগুলি একে অপরের সাথে সাংঘর্ষিক; বা যার মধ্যে উদ্বেগগুলি প্রথমে নিয়মকে পরিচালিত করেছিল তা কেবল প্রয়োগ হয় না। বিশেষজ্ঞরা (বা ভয় পাওয়ার কথা নয়!) ভয় পান না কেবল তারা এমন কোনও নিয়ম ভঙ্গ করে যা তারা জেনে থাকে যে কোনও বিশেষ পরিস্থিতিতে তা বোঝায় না। বিশেষজ্ঞরা ক্রমাগত তাদের নৈপুণ্যে বিভিন্ন ঝুঁকি এবং উদ্বেগের ভারসাম্য বজায় রাখার জন্য আচরণ করছেন এবং বিভিন্ন কারণগুলিতে ভারসাম্য বজায় রাখার জন্য এবং নিয়ম অনুসরণ করার জন্য কেবল কোনও নিয়মের টেবিলে নির্ভর করতে না পারার জন্য নিয়মিত এই ধরণের নিয়ম ভাঙতে বেছে নিতে তাদের রায়টি অবশ্যই বারবার ব্যবহার করা উচিত। Gotoউদাহরণ হিসাবে ধরুন : তারা ক্ষতিকারক কিনা তা নিয়ে দীর্ঘ, পুনরাবৃত্তি, বিতর্ক হয়েছে। (হ্যাঁ, কখনও গোটোস ব্যবহার করবেন না ; ডি)

একটি মডেল প্রস্তাব

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

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

সুতরাং, সাধারণ নিয়মগুলি তলদেশে প্রদর্শিত হবে এমন পরিপূর্ণ মডেল প্রস্তাবনা নয়, বরং এর পরিবর্তে একটি স্ট্যান্ডার্ড বয়লারপ্লেটযুক্ত রুল দেওয়ার একটি সংক্ষিপ্ত উপায়, যা নীচের মত কিছু:

যদি না আপনার নির্দিষ্ট করে বলার ক্ষমতা না থাকে যে কোনও নির্দিষ্ট ক্ষেত্রে এই নির্দেশিকাটি ভুল, এবং নিজেকে প্রমাণ করেছেন যে আপনি ঠিক আছেন, তবে $ U Rule}

যেখানে অবশ্যই আপনি never ls{RULE place এর জায়গায় "কখনই আউটপুট পার্সিং" করতে পারবেন না } :)

ও আচ্ছা! আউটপুট পার্সিং সম্পর্কে কী ls?

ঠিক আছে, তাই, সমস্ত দেওয়া ... আমি মনে করি এটি বেশ পরিষ্কার যে এই নিয়মটি একটি ভাল একটি। প্রথমত, আসল নিয়মটি মূর্তিবিহীন হতে হবে, উপরে বর্ণিত হিসাবে ...

তবে তদ্ব্যতীত, এটি নির্দিষ্ট নয় যে কোনও বিশেষ ক্ষেত্রে এটি ভেঙে যেতে পারে কিনা তা জানতে আপনাকে শেল স্ক্রিপ্টিংয়ের সাথে খুব ভাল হতে হবে। এটি, এটিও, যখন আপনি পরীক্ষায় এটি ভাঙার চেষ্টা করছেন তখন এটি ভুল হয়েছে বলে আপনাকে ঠিক তত দক্ষতার দরকার হয়! এবং আমি আত্মবিশ্বাসের সাথে বলতে পারি যে এই জাতীয় নিবন্ধগুলির সম্ভাব্য শ্রোতাদের একটি খুব বড় সংখ্যাগুরু (giving এর আউটপুটকে বিশ্লেষণ করবেন না ls! Advice) এর মতো পরামর্শ দিতে পারে না , এবং যাদের দক্ষতা রয়েছে তারা সম্ভবত বুঝতে পারবেন যে তারা নিজেরাই এটি আবিষ্কার করে এবং যাইহোক নিয়ম উপেক্ষা করে।

তবে ... কেবল এই প্রশ্নটি দেখুন এবং সম্ভবত যে দক্ষতা রয়েছে এমন লোকেরাও এটি করাকে খারাপ কল বলে মনে করেছিল; এবং প্রশ্নের লেখক কতটা প্রচেষ্টা ব্যয় করেছেন কেবলমাত্র বর্তমানের সেরা উদাহরণের এক বিন্দুতে! আমি আপনাকে এমন সমস্যায় গ্যারান্টি দিচ্ছি যে খুব কঠিন, সেখানকার 99% লোক ভুল হয়ে উঠবে, এবং খুব খারাপ ফলাফল সহ! এমনকি যদি সিদ্ধান্ত নেওয়া পদ্ধতিটি একটি ভাল হিসাবে দেখা দেয়; যতক্ষণ না এটি (বা অন্য) lsবিশ্লেষণ ধারণাটি আইটি / বিকাশকারী লোকেরা সামগ্রিকভাবে গ্রহণ করে, প্রচুর পরীক্ষার (বিশেষত সময়ের পরীক্ষা) প্রতিরোধ করে এবং অবশেষে, একটি 'সাধারণ কৌশল' স্ট্যাটাসে স্নাতক হয়, সম্ভবত এটি সম্ভবত একটি প্রচুর লোক এটি চেষ্টা করতে পারে এবং ভুল হতে পারে ... বিপর্যয়কর পরিণতি সহ।

তাই, আমি শেষবারের মত পুনরাবৃত্তি হবে .... যে বিশেষত এই ক্ষেত্রে , যে কারণেই " কখনো পার্স lsআউটপুট!" নিশ্চিতভাবে হয় ডান উপায় ফ্রেজ এটা।

[আপডেট 2014-05-18: ওপি-র একটি মন্তব্যের জবাব দেওয়ার জন্য উত্তরের (উপরে) ব্যাখ্যা যুক্তিযুক্ত; নীচের সংযোজনটি গতকাল থেকে প্রশ্নের ওপিতে সংযোজনের জবাবে]

[আপডেট 2014-11-10: যোগ শিরোনাম এবং পুনর্গঠিত / রিফ্যাক্টরড সামগ্রী; এবং এছাড়াও: পুনরায় ফর্ম্যাট করা, পুনর্নির্মাণ, স্পষ্ট করা, এবং উম ... "সংক্ষিপ্ত-আইফায়িং" ... আমি এটিকে কেবল পরিষ্কার-পরিচ্ছন্ন করার উদ্দেশ্য করেছিলাম, যদিও এটি কিছুটা পুনর্নির্মাণে পরিণত হয়েছিল। আমি এটিকে দুঃখজনক অবস্থায় রেখে এসেছি, তাই আমি মূলত এটিকে কিছু আদেশ দেওয়ার চেষ্টা করেছি। প্রথম অনুচ্ছেদটি অক্ষত রেখে বেশিরভাগ ক্ষেত্রে গুরুত্বপূর্ণ মনে হয়েছিল; সুতরাং সেখানে কেবলমাত্র দুটি ছোট পরিবর্তন হয়েছে, রিলান্ড্যান্ট 'তবে' মুছে ফেলা হয়েছে, এবং 'এটি' জোর দিয়েছে]]

Origin আমি মূলত এটির মূল উদ্দেশ্যটি কেবলমাত্র আমার মূল সম্পর্কে স্পষ্টকরণ হিসাবেই করেছি; তবে প্রতিবিম্বের উপর অন্যান্য সংযোজন সম্পর্কে সিদ্ধান্ত নিয়েছে

On পোস্টগুলিতে নির্দেশিকাগুলির জন্য https://unix.stackexchange.com/tour দেখুন


2
কখনও মূ .় নয়। এটি কোনও কিছুর উত্তর নয়।
মাইকজার্ভ

1
হুম। আচ্ছা, আমি জানতাম না কিনা এই প্রশ্নের উত্তর দেবে কে সন্তোষজনক কিন্তু আমি একেবারে এটা হতে আশা করিনি বিতর্কিত । এবং, আমি (মানে) করা হয়নি তর্ক যে 'না' ছিল কোনটাই কথ্য; তবে "এক্স কখনই করবেন না!" একটি অদ্ভুত ব্যবহার । আমি দুটি সাধারণ কেস দেখতে পাচ্ছি যা দেখায় যে 'কখনই / পার্স করবেন না ls!' সঠিক পরামর্শ: 1. প্রদর্শন করুন (আপনার সন্তুষ্টির জন্য) যে প্রতিটি ব্যবহারের ক্ষেত্রে যেখানে lsঅন্য একটি আউটপুট পার্স করতে পারে সেগুলি না করে কোনওভাবে উন্নত superior 2. দেখান যে, উদ্ধৃত মামলায় বিবৃতিটি আক্ষরিক নয়।
শেলিবিটারফ্লাই

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

1
আমার এই পোস্টটি পরিষ্কার করা উচিত। তবুও, এটির সঠিক শব্দটি কখনই নয় । এটি কিছুটা হাস্যকর বিষয় যে লোকেদের মনে হয় তারা অন্যকে কখনই না বলবে বা না বলার যোগ্য - কেবল তাদের বলুন যে এটি কাজ করবে এবং কেন করবে তা ভেবে দেখবেন না তবে কী কাজ করবে এবং কী করবে তা আপনি জানেন। lsএকটি কম্পিউটার ইউটিলিটি - আপনি কম্পিউটার আউটপুট
মাইকজার্ভ

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

16

lsকিছু ক্ষেত্রে আউটপুট বিশ্লেষণ করা কি সম্ভব ? অবশ্যই। ডিরেক্টরি থেকে ইনোড সংখ্যাগুলির তালিকা বের করার ধারণাটি একটি ভাল উদাহরণ - যদি আপনি জানেন যে আপনার বাস্তবায়ন lsসমর্থন করে -q, এবং সেইজন্য প্রতিটি ফাইলই আউটপুটের এক লাইন তৈরি করে, এবং আপনার যা দরকার তা হ'ল ইনোড সংখ্যাগুলি এগুলি পার্স করে বাইরে বেরোন ing ls -Rai1qআউটপুট অবশ্যই একটি সম্ভাব্য সমাধান। অবশ্যই, লেখক যদি এর আগে "ls এর আউটপুটটিকে কখনই বিশ্লেষণ করবেন না" এর মতো পরামর্শ না দেখেন, তবে তিনি সম্ভবত ফাইলের নামগুলির মধ্যে নতুন লাইনের সাথে চিন্তা করবেন না এবং ফলস্বরূপ সম্ভবত 'কিউ' ছেড়ে চলে যাবেন এবং কোডটি প্রান্তের ক্ষেত্রে সূক্ষ্মভাবে ভেঙে যাবে - সুতরাং, এমনকি যদি ক্ষেত্রে পার্সিংয়ের lsআউটপুট যুক্তিসঙ্গত হয় তবে এই পরামর্শটি এখনও কার্যকর।

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

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

নবাগত সম্ভবত ls -s | sort -n | tail -n 1 | awk '{print $2}'একটি ডিরেক্টরিতে বৃহত্তম ফাইল পাওয়ার উপায় হিসাবে ভাবেন । এবং এটি কাজ করে, যতক্ষণ না আপনার নামের সাথে কোনও স্থান সহ কোনও ফাইল থাকে।

ঠিক আছে, তাহলে কেমন ls -s | sort -n | tail -n 1 | sed 's/[^ ]* *[0-9]* *//'? আপনার নামে নামে একটি নতুন লাইন যুক্ত ফাইল না হওয়া পর্যন্ত কাজ করে।

যোগ দেয় -qকরার lsএর আর্গুমেন্ট আছে যখন ফাইলের নাম মধ্যে একটি newline সাহায্য? এটি দেখতে দেখতে এটির মতো দেখতে পাওয়া যাবে, যতক্ষণ না আপনার কাছে 2 আলাদা ফাইল রয়েছে যা ফাইলের একই জায়গায় একই জায়গায় একটি প্রিন্টযোগ্য অক্ষর থাকে এবং তারপরে lsআউটপুট আপনাকে সেগুলির মধ্যে সবচেয়ে বড়টি আলাদা করতে দেয় না। সবচেয়ে খারাপ, "?" প্রসারিত করার জন্য, তিনি সম্ভবত তাঁর শেলটির সাথে পুনরূদ্ধার করেন eval- যার ফলে যদি তিনি নামের একটি ফাইল হিট করেন তবে সমস্যা দেখা দেবে, উদাহরণস্বরূপ,

foo`/tmp/malicious_script`bar

না --quoting-style=shellসাহায্য (আপনার যদি lsএমনকি এটি সমর্থন করে)? নাহ, এখনও প্রদর্শন? মুদ্রণযোগ্য অক্ষরের জন্য, সুতরাং এটি এখনও দ্ব্যর্থহীন যে একাধিক ম্যাচগুলির মধ্যে সবচেয়ে বড়টি ছিল। --quoting-style=literal? না, একই। --quoting-style=localeঅথবা --quoting-style=cআপনাকে যদি সবচেয়ে বড় ফাইলটির নাম দ্বিপাক্ষিকভাবে মুদ্রণের প্রয়োজন হয় তবে আপনাকে সাহায্য করতে পারে তবে পরবর্তী সময়ে আপনার যদি ফাইলটির সাথে কিছু করার প্রয়োজন হয় না - তবে উদ্ধৃতিটি পূর্বাবস্থায় ফেরা এবং বাস্তব ফাইলের নামটিতে ফিরে আসার জন্য কোডের একগুচ্ছ হবে যে আপনি এটি পাস করতে পারেন, বলুন, gzip।

এবং সমস্ত কাজ শেষে, তার কাছে যা আছে তা সমস্ত সম্ভাব্য ফাইলের নামের জন্য নিরাপদ এবং সঠিক, এমনকি এটি অপঠনযোগ্য এবং অনিবার্য নয়, এবং অজগর বা পার্ল বা রুবিতে আরও সহজে, নিরাপদে এবং সহজেই করা যেতে পারত।

বা এমনকি অন্যান্য শেল সরঞ্জামগুলি ব্যবহার করে - আমার মাথার উপরের দিক থেকে, আমি মনে করি এটি কৌশলটি করা উচিত:

find . -type f -printf "%s %f\0" | sort -nz | awk 'BEGIN{RS="\0"} END{sub(/[0-9]* /, "", $0); print}'

এবং কমপক্ষে হিসাবে পোর্টেবল হতে হবে --quoting-style


মাপ সম্পর্কে ওহ সত্য - আমি চেষ্টা করতে পারলে আমি সম্ভবত এটি করতে পারতাম - আমার উচিত? আমি খুব ক্লান্ত বা এই পুরো জিনিসটি - আমি আপনার উত্তরটি পছন্দ করি কারণ আপনি বলতে পারবেন না বা করবেন না বা কখনই করবেন না তবে বাস্তবে উদাহরণ কেন দেবেন আর কীভাবে তুলনীয় না - আপনাকে ধন্যবাদ।
মাইকজার্ভ

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

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

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