* Ls` විග්‍රහ නොකරන්නේ ඇයි (ඒ වෙනුවට කුමක් කළ යුතුද)?


221

මම නිරතුරුවම උපුටා දක්වමින් පිළිතුරු බලන්න , මෙම සබැඳිය නිශ්චිතව ප්රකාශ "කරන්න පේළියේ ls!" මෙය හේතු කිහිපයක් නිසා මට කරදර කරයි:

  1. අනියම් කියවීමේදී අවම වශයෙන් දෝෂ කිහිපයක්වත් මට තෝරා ගත හැකි වුවද, එම සබැඳියේ තොරතුරු තොග වශයෙන් පිළිගෙන ඇති බව පෙනේ.

  2. එම සබැඳියේ දක්වා ඇති ගැටළු වලට විසඳුමක් සෙවීමට කිසිදු ආශාවක් ඇති නොවූ බවක් පෙනේ.

පළමු ඡේදයෙන්:

... ඔබ [ls]ලිපිගොනු ලැයිස්තුවක් ඉල්ලන විට විශාල ගැටළුවක් ඇත: සුදු අවකාශය, නව රේඛා, කොමාව, පයිප්ප සංකේත සහ ඔබ මෙතෙක් භාවිතා කිරීමට උත්සාහ කරන වෙනත් ඕනෑම දෙයක් ඇතුළුව ගොනු නාමයක ඕනෑම අක්ෂරයකට පාහේ යුනික්ස් ඉඩ දෙයි. NUL හැර පරිසීමකය. ... lsගොනු නාම නව රේඛා සමඟ වෙන් කරයි. ඔබට නව රේඛාවක් සහිත ගොනුවක් එහි නමින් ලැබෙන තුරු මෙය හොඳයි. එය ක්‍රියාත්මක කිරීම ගැන මා නොදන්නා බැවින් lsනව රේඛා වෙනුවට NUL අක්ෂර සහිත ගොනු නාමයන් අවසන් කිරීමට ඔබට ඉඩ සලසයි, මෙය අපට ආරක්ෂිතව ගොනු නාම ලැයිස්තුවක් ලබා ගැනීමට නොහැකි වේ ls.

බමර්, හරිද? කොහොමද මෙතෙක් අප නව පේළියකට යොමු කිරීමේ අක්ෂරය හිස් පේලි ගැන අඩංගු විය හැකි දත්ත සඳහා ලැයිස්තුගත දත්ත කාණ්ඩය අවසන් කටයුතු කළ හැක්කේ කෙසේද? හොඳයි, මෙම වෙබ් අඩවියේ ප්‍රශ්න වලට පිළිතුරු දෙන පුද්ගලයින් දිනපතාම මෙවැනි දෙයක් නොකළේ නම්, මම සිතන්නේ අප යම් කරදරයකට පත්ව ඇති බවය.

සත්යය නම්, බොහෝ lsක්රියාත්මක කිරීම් ඇත්ත වශයෙන්ම ඒවායේ ප්රතිදානය විග්‍රහ කිරීම සඳහා ඉතා සරල api එකක් සපයන අතර අපි සියල්ලෝම එය නොදැනුවත්වම එය කරමින් සිටිමු. ඔබට ගොනු නාමයක් ශුන්‍යයෙන් අවසන් කළ හැකිවා පමණක් නොව, ඔබට එය ශුන්‍යයෙන් හෝ වෙනත් අත්තනෝමතික නූලකින් ආරම්භ කළ හැකිය. එපමණක්ද නොව, ඔබට මෙම අත්තනෝමතික නූල් ගොනු වර්ගයකට පැවරිය හැකිය . කරුණාකර සලකා බලන්න:

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සමහර විට ඔබේ ගොනු දත්ත garbles (අපේ නඩුව දී, එය හැරී \nචරිතය වචන අතර "A" සහ "නව පේළියකට යොමු කිරීමේ අක්ෂරය" බවට ? ප්රශ්නාර්ථ ලකුණ ...

...

වත්මන් නාමාවලියෙහි ඇති සියලුම ලිපිගොනු නැවත සැකසීමට ඔබට අවශ්‍ය නම්, forලූපයක් සහ ග්ලෝබ් එකක් භාවිතා කරන්න:

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

කතුවරයා එය ෂෙල් ග්ලෝබ් අඩංගු ගොනු නාම ලැයිස්තුවක් ආපසු ලබා දෙන විට ලිපිගොනු කසළ ලෙස හඳුන්වන අතර පසුව ගොනු ලැයිස්තුවක් ලබා ගැනීමට ෂෙල් ග්ලෝබ් භාවිතා කිරීම නිර්දේශ කරයි!ls

පහත සඳහන් කරුණු සලකා බලන්න:

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'

POSIX නිර්වචනය-1සහ -q lsඑසේ operands:

-q- මුද්‍රණය කළ නොහැකි ගොනු නාම අක්ෂරවල සෑම අවස්ථාවක්ම <tab>ප්‍රශ්නාර්ථ ලකුණ ( '?') අක්‍ෂරය ලෙස ලිවීමට බල කරන්න . ප්‍රතිදානය පර්යන්ත උපාංගයකට නම් ක්‍රියාත්මක කිරීම මඟින් පෙරනිමියෙන් මෙම විකල්පය ලබා දිය හැකිය.

-1- (සංඛ්‍යාංක අංක එකකි.) ප්‍රතිදානය එක් පේළියකට එක් ප්‍රවේශයක් ලෙස බල කරන්න.

Globbing එහි ම ප්රශ්නයක් නොමැතිව නොවේ - මෙම ?තරග ඕනෑම චරිතයක් බහු ගැලපෙන නිසා ?ලැයිස්තුවක් ප්රතිඵල එම ගොනුව වාර කිහිපයක් ගැලපෙන ඇත. එය පහසුවෙන් හැසිරවිය හැකිය.

මෙම ක්‍රියාව සිදු කරන්නේ කෙසේද යන්න කාරණය නොවේ - සියල්ලට පසු බොහෝ දේ කිරීමට අවශ්‍ය නොවන අතර එය පහත දැක්වේ - ඇයි නැත්තේ යන්න ගැන මම උනන්දු විය . මා සලකන පරිදි, එම ප්‍රශ්නයට හොඳම පිළිතුර පිළිගෙන ඇත. මිනිසුන්ට කළ නොහැකි දේට වඩා ඔවුන්ට කළ හැකි දේ පැවසීමට වැඩි අවධානයක් යොමු කිරීමට මම ඔබට යෝජනා කරමි . මම සිතන පරිදි, ඔබ අවම වශයෙන් වැරදි බව ඔප්පු කිරීමට ඇති ඉඩකඩ අඩුය.

නමුත් ඇයි උත්සාහ කරන්නේ? මගේ මූලික අභිප්‍රාය වූයේ අන් අය මට නොකියන බව පැවසීමයි. lsප්‍රතිදානය නිත්‍ය සහ පුරෝකථනය කළ හැකි බව මම හොඳින් දනිමි . බොහෝ දේ කරනවාට වඩා වැරදි තොරතුරු මට කරදර කරයි.

පැට්රික් සහ Wumpus ප්රශ්නය Wumbley උත්තර දෙකම සැලකිය යුතු හැර, නමුත් සත්යය වේ (එම ධුරයෙන් නියමයි හසුරුව තිබියදීත්) , මම බොහෝ විට නිවැරදි ලෙස මෙහි පිළිතුරු දී බොහෝ තොරතුරු සලකන්නේ - shell එකක් glob භාවිතය වැඩි දෙකම සරල සහ විග්‍රහ කිරීමට වඩා වත්මන් නාමාවලිය සෙවීමේදී සාමාන්‍යයෙන් වඩාත් effective ලදායී lsවේ. ඔවුන්, කෙසේ වෙතත්, අඩු වශයෙන් මගේ සම්බන්ධයෙන්, එක්කෝ ඉහත ලිපියේ සඳහන් වූ වැරදි තොරතුරු ප්රචාරය කිරීම යුක්ති සහගත කිරීමට හේතුව ප්රමාණවත් හෝ ඔවුන් පිළිගත හැකි යුක්ති සහගත වේ " විග්රහ කළ කවදාවත් ls. "

පැට්රික් පිළිතුර ගේ නොගැලපෙන ප්රතිඵල වැඩි වශයෙන් ඔහුට භාවිතය හේතුවෙන් බව කරුණාවෙන් සලකන්න zshනම් bash. zsh- පෙරනිමියෙන් - වචන බෙදීමේ $(විධානය ආදේශක ප්‍රති )results ල අතේ ගෙන යා හැකි ආකාරයකින් සිදු නොකරයි . ඉතින් ඔහු ඇසූ විට ඉතිරි ලිපිගොනු ගියේ කොහේද? එම ප්‍රශ්නයට පිළිතුර ඔබේ කවචය ඒවා අනුභව කිරීමයි. අතේ ගෙන යා හැකි ෂෙල් කේතය SH_WORD_SPLITභාවිතා zshකිරීමේදී හා ගනුදෙනු කිරීමේදී විචල්‍යය සැකසීමට අවශ්‍ය වන්නේ මේ නිසා ය . ඔහුගේ පිළිතුරේ මෙය සටහන් කිරීමට ඔහු අපොහොසත් වීම නොමඟ යවන සුළු දෙයක් ලෙස මම සලකමි.

Wumpus පිළිතුර මට ගණනය නැහැ - ලැයිස්තුවක් සන්දර්භය තුළ ?චරිතය වන shell එකක් glob. වෙන කොහොමද ඒක කියන්න මම දන්නේ නැහැ.

බහුවිධ ප්‍රති results ල නඩුවකට මුහුණ දීම සඳහා ඔබ ග්ලෝබ්ගේ කෑදරකම සීමා කළ යුතුය. පහත දැක්වෙන්නේ භයානක ගොනු නාමයන්ගේ පරීක්ෂණ පදනමක් නිර්මාණය කර එය ඔබ වෙනුවෙන් පෙන්වනු ඇත:

{ 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, හෝ අක්ෂර සංඛ්යා සහ shell 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පමණක් මෙතෙක් ස්වභාවිකව එක් විමෝචනය කරනු ඇත /අනුපිළිවෙල, ඉතා පහසුවෙන් පහත සඳහන් සෑම ප්රවේශය සඳහා සියලු dentry තොරතුරු ඇතුළු ආවර්තනික සහ විශ්වාසවන්ත පිරිසගේ FileList සපයනු. මේ වගේ දෙයක් සමඟ ඔබට කුමක් කළ හැකිදැයි සිතා බලන්න:

#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 ඉතා ප්‍රයෝජනවත් විය හැකිය - විශේෂයෙන් ප්‍රති result ල අද්විතීය බව ප්‍රශ්න වූ විට.

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

මේවා මට සිතිය හැකි වඩාත්ම අතේ ගෙන යා හැකි මාධ්‍යයන් පමණි. GNU සමඟ lsඔබට කළ හැක්කේ:

ls --quoting-style=WORD

අවසාන වශයෙන්, ඉනෝඩ සංඛ්‍යා අවශ්‍ය වූ විට මම නිතර නිතර භාවිතා කරන විග්‍රහls කිරීමේ වඩාත් සරල ක්‍රමයක් මෙන්න :

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

එය ඉනෝඩ් අංක පමණක් ලබා දෙයි - එය තවත් පහසු POSIX නිශ්චිත විකල්පයකි.


12
ikmikeserv හරි මම කළා. ෂෙල් ග්ලෝබ් 2.48 ගුණයකින් වේගවත්ය. time bash -c 'for i in {1..1000}; do ls -R &>/dev/null; done'= 3.18s vs time bash -c 'for i in {1..1000}; do echo **/* >/dev/null; done'= 1.28s
පැට්‍රික්

28
ඔබගේ නවතම යාවත්කාලීනය සම්බන්ධයෙන්, කරුණාකර ඔබේ කේතය ක්‍රියාත්මක වන බව තීරණය කිරීමේදී දෘශ්‍ය ප්‍රතිදානය මත රඳා සිටීම නවත්වන්න. ඔබේ ප්‍රතිදානය සත්‍ය වැඩසටහනකට යොමු කර වැඩසටහනට උත්සාහ කර ගොනුවේ මෙහෙයුමක් සිදු කරන්න. statසෑම ගොනුවක්ම තිබේද යන්න සැබවින්ම පරික්‍ෂා කරන බැවින් මම මගේ පිළිතුරෙහි භාවිතා කළේ මේ නිසාය . sedකාරණය සමඟ ඔබේ පතුලේ වැඩ කරන්නේ නැත.
පැට්රික්

60
ඔබට බැරෑරුම් විය නොහැක. ඔබේ ප්‍රශ්නය විස්තර කරන සියලුම වළලු හරහා පැනීම පහසු හෝ සරල හෝ පළමු ආකාරයෙන් විග්‍රහ නොකිරීමට වඩා හොඳ lsවන්නේ කෙසේද? ඔබ විස්තර කරන දේ ඉතා දුෂ්කර ය. ඒ සියල්ල තේරුම් ගැනීමට මට එය නැවත සකස් කිරීමට අවශ්‍ය වන අතර මම සාපේක්ෂව දක්ෂ පරිශීලකයෙක්මි. ඔබේ සාමාන්‍ය ජෝට මේ වගේ දෙයක් සමඟ ගනුදෙනු කිරීමට හැකි වේ යැයි බලාපොරොත්තු විය නොහැක.
ටර්ඩන්

50
-1 තර්කයක් තෝරා ගැනීමට ප්‍රශ්නයක් භාවිතා කිරීම සඳහා. lsප්‍රතිදානය විග්‍රහ කිරීම වැරදි වීමට හේතු සියල්ලම මුල් සබැඳිය තුළ හොඳින් ආවරණය වී ඇත (සහ වෙනත් බොහෝ ස්ථානවල). OP එය තේරුම් ගැනීමට උදව් ඉල්ලා සිටියේ නම් මෙම ප්‍රශ්නය සාධාරණ වනු ඇත, නමුත් ඒ වෙනුවට OP උත්සාහ කරන්නේ ඔහුගේ වැරදි භාවිතය නිවැරදි බව ඔප්පු කිරීමට ය.
ආර් .. GitHub STOP HELPING ICE

15
ikmikeserv එය පමණක් නොවේ parsing ls is bad. කරන්නේ for something in $(command)හා නිවැරදි ප්රතිඵල ලබා ගැනීමට වචනය පැලෙන මත රඳා විශාල බහුතරයක් සඳහා නරක command'sවන සරල ප්රතිදානය නැහැ.

Answers:


194

මම මේ ඒත්තු සියලු දී නැහැ, නමුත් ගේ පීචං වාදය සඳහා ඔබ ඉඩ දෙන්න හැකි ඔබ ප්රතිදානය විග්රහ කළ, ප්රමාණවත් තරම් උත්සාහයක් ක්රියාත්මක කිරීමට සූදානම් වනවා නම්, 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)සෘජුවම ප්‍රති result ලය භාවිතා කරන්න .

ඒ හා සමානව වැදගත් වන අතර, ඔබ ලියූ දෙයට වඩා හාත්පසින්ම වෙනස්ව, මෙතැන් සිට මාස හයක් යනතුරු එය අර්ථවත් වනු ඇති අතර, තරමක් වෙනස් දෙයක් කිරීමට ඔබට අවශ්‍ය වූ විට එය වෙනස් කිරීම පහසු වනු ඇත. නිදර්ශන ආකාරයෙන්, ඔබ තිත් ලිපිගොනු සහ සංස්කාරක උපස්ථයන් බැහැර කිරීමේ අවශ්‍යතාවය සොයාගෙන ඇති අතර, සියල්ල අකාරාදී පිළිවෙලට මූලික නාමයෙන් සැකසීමට අවශ්‍ය යැයි සිතමු:

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කථා කරයිද ? මට විශ්වාස නැහැ. එය එකකට වඩා වැඩි විය නොහැකි වුවත්, හරිද? මෙතෙක් මට තේරෙන එකම පිළිතුර මෙයයි.
mikeserv

11
forපුනරාවර්තනයක් නැත, කැදැලි- ලූප් පමණි. os.walkතිරයෙන් පිටුපස ඇතැමුන් බරපතල ලෙස බර ඉසිලීම කරන්නේ, එහෙත් ඔබ තවත් ඔබ ගැන කරදර වෙන්න ඕනේ වඩා ඒ ගැන කලබල වීමට හේතුවක් නැත lsහෝ findඅභ්යන්තර කටයුතු.
zwol

8
තාක්ෂණික වශයෙන්, ජනක වස්තුවක්os.walk ආපසු ලබා දේ . ජනක යන්ත්‍ර යනු කම්මැලි ලැයිස්තු වල පයිතන්ගේ අනුවාදයයි. පිටත-ලූප් පුනරාවර්තනය වන සෑම අවස්ථාවකම, උත්පාදක යන්ත්රය ආයාචනා කර වෙනත් උප බහලුමක අන්තර්ගතය "ලබා දෙයි". පර්ල් හි සමාන ක්‍රියාකාරීත්වය , එය උපකාරී වේ නම්. File::Find
zwol

6
ඔබ විවේචනය කරන ලියවිල්ල හා පැට්‍රික් සහ ටර්ඩන්ගේ පිළිතුරු සමඟ මම 100% ක් එකඟ වන බව ඔබ දැන සිටිය යුතුය. මගේ පිළිතුර අදහස් කළේ ප්‍රතිදානය විග්‍රහ කිරීමෙන් වළක්වා ගැනීම සඳහා අතිරේක ස්වාධීන හේතුවක් සැපයීමයි ls.
zwol

23
මෙය ඉතා නොමඟ යවන සුළුය. ෂෙල් හොඳ ක්‍රමලේඛන භාෂාවක් නොවේ, නමුත් එය ක්‍රමලේඛන භාෂාවක් නොවන නිසා පමණි. එය ස්ක්‍රිප්ටින් භාෂාවකි. එය හොඳ ස්ක්‍රිප්ටින් භාෂාවකි.
සැතපුම් මාවත

184

තොරතුරු සම්පුර්ණයෙන්ම නිවැරදි බැවින් එම සබැඳිය බොහෝ දුරට යොමු කර ඇති අතර එය ඉතා දිගු කාලයක් තිස්සේ පැවතුනි.


lsමුද්‍රණය කළ නොහැකි අක්ෂර වෙනුවට ග්ලෝබ් අක්ෂර ආදේශ කරයි, නමුත් එම අක්ෂර සත්‍ය ගොනු නාමයේ නොමැත. මෙය වැදගත් වන්නේ ඇයි? හේතු 2 ක්:

  1. ඔබ එම ගොනු නාමය වැඩසටහනකට යොමු කළහොත්, එම ගොනු නාමය ඇත්ත වශයෙන්ම නොපවතී. නියම ගොනු නාමය ලබා ගැනීම සඳහා එයට ගෝලීයය පුළුල් කළ යුතුය.
  2. ගොනු ග්ලෝබ් එක් ගොනුවකට වඩා ගැලපේ.

උදාහරණයක් වශයෙන්:

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

අපට සමාන ගොනු 2 ක් ඇති ආකාරය සැලකිල්ලට ගන්න. ඔවුන් දෙදෙනාම නිරූපණය කරන්නේ නම් ඔබ ඒවා වෙන්කර හඳුනා ගන්නේ කෙසේද a?b?


කතුවරයා එය ෂෙල් ග්ලෝබ් අඩංගු ගොනු නාම ලැයිස්තුවක් ආපසු ලබා දෙන විට ලිපිගොනු කසළ ලෙස හඳුන්වන අතර ගොනු ලැයිස්තුවක් ලබා ගැනීමට ෂෙල් ග්ලෝබ් භාවිතා කිරීමට නිර්දේශ කරයි!

මෙහි වෙනසක් ඇත. පෙන්වා ඇති පරිදි, ඔබ ග්ලෝබ් ආපසු ලබා ගත් විට, එම ග්ලෝබ් එකකට වඩා වැඩි ගණනකට ගැලපේ. කෙසේ වෙතත්, ඔබ ග්ලෝබ් එකකට ගැලපෙන ප්‍රති results ල හරහා නැවත කියවන විට, ඔබට ග්ලෝබ් එකක් නොව නිශ්චිත ගොනුව ආපසු ලැබෙනු ඇත.

උදාහරණයක් වශයෙන්:

$ 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 සමඟ විය. මම පටිපාටිය බාෂ් සමඟ නැවත කරන විට, ඔබේ උදාහරණය සමඟ තවත් සම්පූර්ණයෙන්ම වෙනස් ප්‍රති results ල ලබා ගනිමි:

එකම ගොනු සමූහයක්:

$ 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

ඔබේ කේතය සමඟ රැඩිකල් ලෙස වෙනස් ප්‍රති results ල:

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
ikmikeserv ඇත්ත වශයෙන්ම ඔහුගේ විසඳුම ග්ලෝබ් එකක් ලබා දෙන්නේ නැත. එම කරුණ පැහැදිලි කිරීම සඳහා මම මගේ පිළිතුර යාවත්කාලීන කළෙමි.
පැට්‍රික්

19
"ඉතිරිය නොවේ"? එය නොගැලපෙන හැසිරීම සහ අනපේක්ෂිත ප්‍රති results ල, එය හේතුවක් නොවන්නේ කෙසේද?
පැට්රික්

11
ikmikeserv ඔබේ ප්‍රශ්නය පිළිබඳ මගේ අදහස ඔබ දුටුවේ නැද්ද? ෂෙල් ග්ලෝබ් කිරීම 2.5 ගුණයකින් වේගවත් ය ls. ඔබේ කේතය ක්‍රියාත්මක නොවන බැවින් එය පරීක්ෂා කරන ලෙස මම ඉල්ලා සිටිමි. Zsh ට මේ කිසිවක් සමඟ ඇති සම්බන්ධය කුමක්ද?
පැට්රික්

27
ikmikeserv නැත, ඒ සියල්ල තවමත් බැෂ් සඳහා අදාළ වේ. මම මේ ප්‍රශ්නයට එකඟව කටයුතු කළත් ඔබ මා කියන දේට ඇහුම්කන් නොදේ.
පැට්රික්

8
ඔබ දන්නවාද, මම හිතන්නේ මම මෙම පිළිතුර ඉහළට ඔසවා එය පැහැදිලි කරන අතර එය පවසන සෑම දෙයක්ම සමඟ මම එකඟ වෙමි. ;-)
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 ක් ඇත, නමුත් bash වාර්තා කරයි 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
මම මෙය ඉහළට ඔසවා තැබුවෙමි. ඔබේම කේතය ඔබට දෂ්ට කිරීම දැකීම සතුටක්. නමුත් මම එය වැරදියට වටහා ගත් පමණින් එය නිවැරදිව කළ නොහැකි යැයි අදහස් නොවේ. අද උදේ එය සිදු කිරීම සඳහා මම ඔබට ඉතා සරල ක්‍රමයක් පෙන්වා දුන්නෙමි ls -1qRi | grep -o '^ *[0-9]*'- එය lsප්‍රතිදානය විග්‍රහ කරයි, මිනිසා, එය ඉනෝඩ අංක ලැයිස්තුවක් ලබා ගැනීමට මා දන්නා වේගවත්ම හා හොඳම ක්‍රමයයි.
mikeserv

42
ikmikeserv: ඔබට කාලය සහ ඉවසීම තිබේ නම් එය නිවැරදිව කළ හැකිය . නමුත් කාරණය නම්, එය සහජයෙන්ම දෝෂ සහිත ය. ඔබම එය වැරදියි. එහි ගුණාංග ගැන වාද කරමින් සිටියදී! ඒ සඳහා සටන් කරන එක් පුද්ගලයෙකු පවා එය නිවැරදිව කිරීමට අපොහොසත් වුවහොත් එය එයට එරෙහි දැවැන්ත වැඩ වර්ජනයකි. සමහර විට ඔබ එය නිවැරදි වීමට පෙර එය වැරදියට වටහා ගැනීමට වැඩි කාලයක් ගත කරනු ඇත. මම ඔබ ගැන නොකියමි, නමුත් බොහෝ දෙනෙකුට එකම කේත රේඛාවක් ඇති වයස් කාණ්ඩවල සිටින අයට වඩා ඔවුන්ගේ කාලය සමඟ කටයුතු කිරීම හොඳය.
cHao

HcHao - මම එහි සුදුසුකම් ගැන තර්ක කළේ නැත - මම එහි ප්‍රචාරයට විරෝධය දැක්වුවෙමි.
mikeserv

18
ikmikeserv: එයට එරෙහි තර්ක හොඳින් ස්ථාපිත සහ සුදුසු ය. ඔබ පවා ඒවා සත්‍ය බව පෙන්වා ඇත.
cHao

1
HcHao - මම එකඟ නොවෙමි. මන්ත්‍රයක් හා ප්‍ර .ාවක් අතර එතරම් සියුම් රේඛාවක් නොමැත.
mikeserv

52

ප්‍රතිදානය ls -qකිසිසේත්ම ගෝලීය නොවේ. එහි ?තේරුම "මෙහි සෘජුවම පෙන්විය නොහැකි අක්‍ෂරයක් ඇත" යන්නයි. ග්ලෝබ්ස් ?යන්නෙන් අදහස් කරන්නේ "ඕනෑම චරිතයක් මෙහි අවසර ඇත" යන්නයි.

ග්ලෝබ්ස් වලට වෙනත් විශේෂ අක්ෂර ඇත ( *සහ []අවම වශයෙන්, සහ []යුගලය තුළ තවත් බොහෝ දේ ඇත). ඒ කිසිවකින් පැන යන්නේ නැත ls -q.

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

ඔබ ls -1qප්‍රතිදානයට සලකන්නේ නම් ග්ලෝබ් කට්ටලයක් ඇති අතර ඒවා පුළුල් කරන්න, ඔබට xදෙවරක් ලැබෙනු ඇත පමණක් නොව , ඔබට [x]සම්පූර්ණයෙන්ම මග හැරෙනු ඇත. ග්ලෝබ් ලෙස, එය නූලක් ලෙස නොගැලපේ.

ls -q ඔබේ ඇස් සහ / හෝ පර්යන්තය පිස්සු අක්ෂර වලින් බේරා ගැනීමට අදහස් කරන අතර, ඔබට නැවත කවචයට පෝෂණය කළ හැකි යමක් නිපදවීමට නොවේ.


41

පිළිතුර ඉතා සරල ය: ඔබේ විශේෂ අවස්ථා වලදී lsකළ හැකි ප්‍රතිලාභ ඉක්මවා යා යුතුය. ඔබ lsප්‍රතිදානය විග්‍රහ නොකරන්නේ නම් මෙම විශේෂ අවස්ථා මඟහරවා ගත හැකිය .

මෙහි ඇති මන්ත්‍රය කිසි විටෙකත් පරිශීලක ගොනු පද්ධතිය විශ්වාස නොකරයි ( පරිශීලක ආදානය කිසි විටෙකත් විශ්වාස කිරීමට සමාන නොවේ ). 100% නිශ්චිතභාවයකින් යුතුව සෑම විටම ක්‍රියාත්මක වන ක්‍රමවේදයක් තිබේ නම්, එය එසේ lsකළත් අඩු නිශ්චිතභාවයකින් වුවද ඔබ කැමති ක්‍රමය විය යුතුය . ටර්ඩන් සහ පැට්‍රික් විසින් පුළුල් ලෙස ආවරණය කර ඇති බැවින් මම තාක්ෂණික තොරතුරු වෙත නොයමි . lsමගේ රැකියාව / කීර්තිය පවතින වැදගත් (හා සමහර විට මිල අධික) ගනුදෙනුවක භාවිතා කිරීමේ අවදානම නිසා , එය වළක්වා ගත හැකි නම් අවිනිශ්චිතතාවයේ ශ්‍රේණියක් නොමැති ඕනෑම විසඳුමකට මම කැමැත්තෙමි.

සමහර අය නිශ්චිතභාවයට වඩා යම් අවදානමක් කැමති බව මම දනිමි , නමුත් මම දෝෂ වාර්තාවක් ගොනු කර ඇත්තෙමි .


32

කිසි විටෙකත් කිසිවක් නොකරන්නැයි මිනිසුන් පවසන හේතුව අනිවාර්යයෙන්ම එය නිවැරදිව කළ නොහැකි බැවිනි. අපට එසේ කිරීමට හැකි විය හැකි නමුත් එය වඩාත් සංකීර්ණ, අවකාශය හෝ වේලාව අනුව අඩු කාර්යක්ෂම විය හැකිය. උදාහරණයක් ලෙස "x86 එකලස් කිරීමේදී කිසි විටෙකත් විශාල ඊ-වාණිජ්‍ය පසුබිමක් ගොඩනඟන්න එපා" යැයි පැවසීම හොඳය.

එබැවින් දැන් ඇති ගැටලුව වෙත: ඔබ නිරූපණය කර ඇති පරිදි ඔබට ls විග්‍රහ කර නිවැරදි ප්‍රති result ලය ලබා දෙන විසඳුමක් නිර්මාණය කළ හැකිය - එබැවින් නිවැරදිභාවය ප්‍රශ්නයක් නොවේ.

එය වඩාත් සංකීර්ණද? ඔව්, නමුත් අපට එය උපකාරක ශ්‍රිතයක් පිටුපස සැඟවිය හැක.

එබැවින් දැන් කාර්යක්ෂමතාවයට:

අභ්‍යවකාශ-කාර්යක්ෂමතාව: ඔබේ විසඳුම uniqඅනුපිටපත් පෙරීම මත රඳා පවතී , එම නිසා අපට කම්මැලි ලෙස ප්‍රති results ල ජනනය කළ නොහැක. එබැවින් එක්කෝ O(1)එදිරිව O(n)හෝ දෙකම තිබේ O(n).

කාලය කාර්යක්ෂමතාව: හොඳම නඩුව uniqඅපි තවමත් ඇති පරිදි, hashmap ප්රවේශය භාවිතා O(n)මූලද්රව්ය සංඛ්යාව ඇල්ගොරිතමය ප්රසම්පාදනය ඒක බොහෝ විට නමුත් O(n log n).

දැන් සැබෑ ගැටළුව: ඔබේ ඇල්ගොරිතම තවමත් එතරම් නරක නොවන බව පෙනෙන්නට තිබුණද, මම සැබවින්ම පරිස්සම් වූයේ ප්‍රසම්පාදනය කරන ලද මූලද්‍රව්‍යයන් මිස n සඳහා මූලද්‍රව්‍ය නොවේ. මන්ද එය විශාල වෙනසක් ඇති කරයි. ඔබට ගොනුවක් \n\nඇති බව පවසන්න, ??එමඟින් ග්ලෝබ් එකක් ලැබෙනු ඇත, එබැවින් ලැයිස්තුගත කිරීමේ සෑම අක්ෂර 2 ක්ම ගැලපෙන්න. ඔබ තවත් ගොනුවක් තිබේ Funnily නම් \n\rද හේතු වනු ඇතැයි ??ද සියලු 2 චරිතය ගොනු නැවත .. මේ යන්නේ කොහේද බලන්න රේඛීය හැසිරීම වෙනුවට on ාතීය බව නිසැකවම "වඩාත් නරක ධාවන කාල හැසිරීම" ලෙස සුදුසුකම් ලබයි .. එය ප්‍රායෝගික ඇල්ගොරිතමයක් සහ න්‍යායාත්මක සීඑස් සඟරාවල ඔබ ලියන ලිපි අතර වෙනස වේ.

හැමෝම උදාහරණ වලට ආදරෙයි නේද? මෙන්න අපි යනවා. "ටෙස්ට්" නමින් ෆෝල්ඩරයක් සාදා ෆෝල්ඩරය ඇති එකම ඩිරෙක්ටරියේම මෙම පයිතන් ස්ක්‍රිප්ට් භාවිතා කරන්න.

#!/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()

මෙය කළ හැකි එකම දෙය වන්නේ අක්ෂර 7 ක් සඳහා දිග 3 හි සියලු නිෂ්පාදන උත්පාදනය කිරීමයි. උසස් පාසැල් ගණිතය අපට පවසන්නේ එය ලිපිගොනු 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 හි වැඩ කිරීමට මෙහි ඇති දෙය (මෙම ක්‍රමයේ උපයෝගීතාව සඳහා පරිමාවන් කථා කරන බව මම සිතමි).

කෙසේ වෙතත්, ඉහත සඳහන් ප්‍රති the ලය ලැබීමෙන් පසුව පමණක් පෙරහන් කරන බැවින්, පෙර විසඳුම අවම වශයෙන් පසුකාලීනව ඉක්මන් විය යුතුය (එම ක්‍රමයේ කිසිදු ඉනෝඩ උපක්‍රමයක් නැත- නමුත් ඒවා විශ්වාස කළ නොහැකි බැවින් ඔබ නිවැරදි බව අත්හරිනු ඇත).

ඉතින් දැන් කොපමණ කාලයක් ගතවේද?

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

ගන්න? හොඳයි, මම නොදනිමි, ලිපිගොනු 343 ^ 343 පරීක්ෂා කිරීමට ටික කාලයක් ගතවේ - විශ්වයේ තාප මරණයෙන් පසු මම ඔබට කියමි.


6
ඇත්ත වශයෙන්ම, වෙනත් පිළිතුරක් යටතේ අදහස් දැක්වීම්වල සඳහන් කර ඇති පරිදි , "... ඔබට නිරූපණය කර නිවැරදි විසඳුමක් ලබා දිය හැකි බව ඔබ නිරූපණය කර ඇත ..." යන ප්‍රකාශය සත්‍ය නොවේ.
වයිල්ඩ්කාඩ්

26

OP හි ප්‍රකාශිත අභිප්‍රාය ඇමතීම

පෙරවදන සහ මුල් පිළිතුර බැංකුවේ තර්කය 2015-05-18 යාවත්කාලීන

මයික්සර්ව් (ඕපී) ඔහුගේ ප්‍රශ්නයට නවතම යාවත්කාලීනයේ මෙසේ සඳහන් කර ඇත: “මම මෙම ප්‍රශ්නය මුලින්ම වැරදි තොරතුරු මූලාශ්‍රයක් පෙන්වා දීමට ඇසීම ලැජ්ජාවක් ලෙස සලකමි . අවාසනාවකට මෙන් මෙහි වඩාත්ම උත්තරීතර පිළිතුර බොහෝ දුරට නොමඟ යවන සුළුය. "

හොඳයි, හරි; මම එය මගේ පමණක් සොයා ගැනීමට අර්ථය පැහැදිලි කරන ආකාරය තේරුම් ගන්න උත්සාහ විශාල කාලයක් වැය කරනවාට ලැජ්ජාවක් විය දැනෙනවා බව ප්රශ්නය මම නැවත කියවන්න. මෙම ප්රශ්නය "[උත්පාදන] වෙනුවට පිළිතුරු වඩා" සාකච්ඡාවක් අවසන් හා ට බර අවසන් පෙළ ~ 18K (ප්රශ්නය සඳහා පමණක්, හුදෙක් පැහැදිලි කිරීමට) පවා බ්ලොග් තනතුර සඳහා කාලයක් ගත වනු ඇති.

නමුත් StackExchange ඔබේ සබන් පෙට්ටිය නොවන අතර එය ඔබේ බ්ලොගය නොවේ. කෙසේ වෙතත්, ඇත්ත වශයෙන්ම, ඔබ එය අවම වශයෙන් දෙකම ලෙස භාවිතා කර ඇත. මිනිසුන්ගේ සත්‍ය ප්‍රශ්නවලට පිළිතුරු දීම වෙනුවට ඔබේ “කළ යුතු දේට” පිළිතුරු දීමට මිනිසුන් බොහෝ කාලයක් ගත කළහ. මෙම අවස්ථාවෙහිදී මම ප්‍රශ්නය අපගේ ආකෘතියට සුදුසු නොවන බව සලකුණු කරමි. OP පැහැදිලිවම ප්‍රකාශ කර ඇත්තේ එය කිසිසේත්ම ප්‍රශ්නයක් වීමට අදහස් නොකරන බවයි.

මේ අවස්ථාවේදී මගේ පිළිතුර කාරණයට සමානද නැද්ද යන්න මට විශ්වාස නැත; බොහෝ විට නැත, නමුත් එය ඔබගේ සමහර ප්‍රශ්න වෙත යොමු කර ඇති අතර සමහර විට එය වෙනත් කෙනෙකුට ප්‍රයෝජනවත් පිළිතුරක් විය හැකිය; ආරම්භකයින් සිතට ගන්න, ඔබ සමහර අත්දැකීම් ලබා ගත් පසු සමහර විට "සමහර විට කරන්න" බවට පත් නොවේ. :)

සාමාන්‍ය රීතියක් ලෙස ...

කරුණාකර ඉතිරි රළු දාරවලට සමාව දෙන්න; මම මේ සඳහා දැනටමත් බොහෝ කාලයක් ගත කර ඇත්තෙමි ... OP කෙලින්ම උපුටා දැක්වීමට වඩා (මුලින් අදහස් කළ පරිදි) මම සාරාංශ කිරීමට සහ අක්ෂර වින්‍යාසය කිරීමට උත්සාහ කරමි.

[බොහෝ දුරට මගේ මුල් පිළිතුරෙන් ප්‍රතිනිර්මාණය කරන ලදි]
සලකා බැලීමේදී, මම පිළිතුරු දුන් ප්‍රශ්න සඳහා OP විසින් අවධාරණය කරන ලද අවධාරණය වැරදි ලෙස කියවා ඇති බව මම විශ්වාස කරමි; කෙසේ වෙතත්, ආමන්ත්‍රණය කරන ලද කරුණු ගෙන එන ලද අතර, පිළිතුරු බොහෝ දුරට නොවෙනස්ව පැවතුන අතර ඒවා නිසි තැනට පැමිණෙනු ඇතැයි මා විශ්වාස කරන අතර වෙනත් සන්දර්භයන් තුළ මෙන්ම ආරම්භකයින්ට දෙන උපදෙස් සම්බන්ධයෙන් මා දුටු ගැටළු වලට විසඳුම් ද ලබා දෙන්නෙමි.

Post lsප්‍රතිදානය විග්‍රහ නොකරන්න »හෝ never ඔබ කිසි විටෙකත් lsප්‍රතිදානය විග්‍රහ නොකළ යුතුය as වැනි විවිධ ලිපි මගින් උපදෙස් ලබා දුන්නේ මන්දැයි මුල් පෝස්ට් ආකාර කිහිපයකින් විමසීය .

ගැටළුවට මා යෝජනා කළ යෝජනාව නම්, මේ ආකාරයේ ප්‍රකාශයන් හුදෙක් මෝඩකමකට උදාහරණ වන අතර එය තරමක් වෙනස් ආකාරයකින් වාක්‍ය ඛණ්ඩනය කර ඇති අතර, නිරපේක්ෂ ප්‍රමාණාත්මකකරණය අත්‍යවශ්‍ය [යුගලයක් සමඟ යුගලනය වේ [උදා, [කිසි විටෙකත් X », Rules [ඔබ සැමවිටම Y »විය යුතුය, one [යමෙක් කිසි විටෙකත් Z»] සාමාන්‍ය නීති හෝ මාර්ගෝපදේශ ලෙස භාවිතා කිරීමට අදහස් කරන ප්‍රකාශ සැකසීමට, විශේෂයෙන් විෂයයකට නවකයන්ට ලබා දෙන විට, නිරපේක්ෂ සත්‍යයන් ලෙස අදහස් කිරීමට වඩා, එසේ වුවද එම ප්‍රකාශවල පැහැදිලි ස්වරූපය .

ඔබ නව විෂය කරුණු ඉගෙන ගැනීමට පටන් ගෙන ඇති විට, සහ ඔබට වෙනත් ආකාරයකින් කළ යුතු වන්නේ මන්ද යන්න පිළිබඳව ඔබට හොඳ අවබෝධයක් නොමැති නම්, පිළිගත් පොදු නීති රීති ව්‍යතිරේකයකින් තොරව අනුගමනය කිරීම හොඳ අදහසකි more වඩා පළපුරුදු කෙනෙකුගේ මග පෙන්වීම යටතේ මිස එය ඔබමයි. ඉහළ යන කුසලතා සහ පළපුරුද්ද සමඟ කිසියම් විශේෂිත තත්වයක් තුළ රීතියක් අදාළ වන්නේ කවදාද සහ කෙසේද යන්න තීරණය කිරීමට ඔබට තවදුරටත් හැකි වේ. ඔබ සැලකිය යුතු පළපුරුද්දකට ළඟා වූ පසු, සාමාන්‍ය රීතිය පිටුපස ඇති හේතුව ඔබ මුලින්ම තේරුම් ගනු ඇති අතර, එම අවස්ථාවේ දී ඔබට රීතිය පිටුපස ඇති හේතු අදාළ වන්නේ ද සහ කුමන මට්ටමට ද යන්න පිළිබඳව ඔබේ විනිශ්චය භාවිතා කිරීමට පටන් ගත හැකිය. එම තත්වය, සහ සමහර විට අතිමහත් උත්සුකයන් තිබේද යන්න පිළිබඳව.

විශේෂ the යෙකු, සමහර විට, "නීති" උල්ලං in නය කරමින් දේවල් කිරීමට තෝරා ගනු ඇත. නමුත් එය ඔවුන්ට "රීති" අඩු නොකරනු ඇත.

තවද, දැනට පවතින මාතෘකාවට: මගේ මතය අනුව, විශේෂ expert යෙකුට මෙම රීතිය මුළුමනින්ම බිඳ දැමීමකින් තොරව උල්ලං to නය කළ හැකි නිසා, ආරම්භකයකුට “සමහර විට” එය පැවසීම සාධාරණීකරණය කළ හැකි කිසිදු ක්‍රමයක් මා දකින්නේ නැත. lsප්‍රතිදානය විග්‍රහ කිරීමට කමක් නැත , මන්ද: එය එසේ නොවේ . නැතහොත්, අවම වශයෙන්, ආරම්භකයකු එසේ කිරීම සුදුසු නැත.

ඔබ සැමවිටම ඔබේ ඉත්තන් මැදට දමන්න; ආරම්භක එක් කැබැල්ලක, එක් පියවරක්; හැකි ඉක්මනින් කාසල්; බිෂොප්වරුන්ට පෙර නයිට්වරු; දාරයේ නයිට්වරයෙක් දරුණු ය; ඔබේ ගණනය අවසානය දක්වා දැකගත හැකි බවට සැමවිටම වග බලා ගන්න! (අපොයි, සමාවෙන්න, වෙහෙසට පත්වීම, එය චෙස් ස්ටැක්එක්ස්චේන්ජ් සඳහා ය.)

රීති, කැඩීමට අදහස් කරනවාද?

ආරම්භකයින් ඉලක්ක කරගත් හෝ කියවීමට ඉඩ ඇති විෂයයක් පිළිබඳ ලිපියක් කියවන විට, බොහෝ විට ඔබ මෙවැනි දේ දකිනු ඇත:

  • "ඔබ කිසි විටෙකත් X නොකළ යුතුය ."
  • "කවදාවත් Q කරන්න එපා!"
  • "ඉසෙඩ් කරන්න එපා."
  • "යමෙක් සෑම විටම Y කළ යුතුය!"
  • "සී, මොනවා වුනත්."

මෙම ප්‍රකාශ නිසැකවම නිරපේක්ෂ හා කාලානුරූපී නීති රීති ප්‍රකාශ කරන බවක් පෙනෙන්නට තිබුණද ඒවා එසේ නොවේ. ඒ වෙනුවට මෙය සාමාන්‍ය නීති [අකා "මාර්ගෝපදේශ", "මාපට ඇඟිලි රීති", "මූලික කරුණු" යනාදිය සඳහන් කිරීමේ ක්‍රමයකි. එම ලිපි කියවන ආරම්භකයින් සඳහා අවම වශයෙන් ඒවා ප්‍රකාශ කිරීමට සුදුසුම ක්‍රමයකි. කෙසේ වෙතත්, ඒවා නිරපේක්ෂ යැයි ප්‍රකාශ කර ඇති පමණින්, නීති රීති නිසැකවම වෘත්තිකයන් සහ විශේෂ experts යින් [එවැනි නීති රීති මුලින් සාරාංශ කළ අය විය හැකිය, ඔවුන් පුනරාවර්තනය සමඟ ගනුදෙනු කරන විට ලබාගත් දැනුම පටිගත කිරීමට හා ලබා ගැනීමට මාර්ගයක් ලෙස. ඔවුන්ගේ විශේෂිත ශිල්පයේ ගැටළු.]

එම නීති රීති නිසැකවම හෙළි නොකරන්නේ විශේෂ expert යෙකු සංකීර්ණ හෝ සූක්ෂම ගැටලුවකට මුහුණ දෙන්නේ කෙසේද යන්නයි. නැතහොත් නීතියට මුලින් හේතු වූ කරුණු සරලවම අදාළ නොවේ. විශේෂ erts යන් බිය නොවන්න (හෝ බිය නොවිය යුතුය!) හුදෙක් දැනගත යුතු නීති කඩ කිරීම විශේෂිත තත්වයක් තුළ තේරුමක් නැත. ප්‍රවීණයන් නිරන්තරයෙන් ඔවුන්ගේ ශිල්පයේ විවිධ අවදානම් සහ උත්සුකයන් සමතුලිත කිරීම සමඟ කටයුතු කරන අතර, එම නීති රීති කඩ කිරීම සඳහා තෝරා ගැනීම සඳහා ඔවුන්ගේ විනිශ්චය නිතර භාවිතා කළ යුතුය, විවිධ සාධක සමතුලිත කර ගත යුතු අතර අනුගමනය කළ යුතු නීති වගුවක් මත පමණක් රඳා සිටීමට නොහැකි විය. ගත Gotoඋදාහරණයක් ලෙස: ඔවුන් හානිකර වේ ද යන්න ගැන දීර්ඝ, නැවත නැවත, වාද වී තියෙන්නේ. (ඔව්, කවදාවත් ගොටෝස් භාවිතා නොකරන්න; ඩී)

ආදර්ශ යෝජනාවක්

අමුතු අංගයක්, අවම වශයෙන් ඉංග්‍රීසියෙන්, සහ වෙනත් බොහෝ භාෂාවලින්, සාමාන්‍ය රීති වලින්, ඒවා මෝඩමය යෝජනාවක් ලෙස එකම ආකාරයකින් ප්‍රකාශ කර තිබීම, නමුත් ක්ෂේත්‍රයක ප්‍රවීණයන් ඒ සඳහා සාමාන්‍ය රීතියක් ලබා දීමට කැමැත්තෙන් සිටී තත්වය, සුදුසු අවස්ථාවලදී ඔවුන් නීතිය කඩ කරන බව දැන සිටීම. එබැවින් පැහැදිලිවම, මෙම ප්‍රකාශයන් මෝඩල් තර්කනයේ එකම ප්‍රකාශයන්ට සමාන යැයි අදහස් නොකෙරේ.

මේ නිසාම මම කියන්නේ ඔවුන් හුදෙක් මුග්ධ විය යුතු බවයි. සැබවින්ම “කවදාවත්” හෝ “සැමවිටම” තත්වයක් නොවී, මෙම නීති සාමාන්‍යයෙන් පුළුල් පරාසයක තත්වයන් සඳහා යෝග්‍ය වන පොදු මාර්ගෝපදේශ කේතනය කිරීමට උපකාරී වන අතර ආරම්භකයින් ඒවා අන්ධ ලෙස අනුගමනය කරන විට බොහෝ දුරට සිදුවිය හැකිය. හොඳ හේතුවක් නොමැතිව ආරම්භකයා ඔවුන්ට එරෙහිව යාමට තෝරා ගැනීමට වඩා හොඳ ප්‍රති results ල. සමහර විට ඔවුන් නීති රීති කේතනය කරන්නේ හුදෙක් ප්‍රමිතීන්ට පටහැනිව වැරදි තේරීම් සමඟ ඇති අසාර්ථකත්වයට වඩා ප්‍රමිතියෙන් තොර ප්‍රති results ලවලට ය.

එබැවින්, සාමාන්‍ය රීති යනු ඒවා මතුපිටින් පෙනෙන නිරපේක්ෂ මොඩල් යෝජනා නොවේ, ඒ වෙනුවට සම්මත බොයිලේරු තහඩුවක් සමඟ රීතිය ලබා දීමේ කෙටිකාලීන ක්‍රමයකි, පහත සඳහන් දේ වැනි ය:

විශේෂිත අවස්ථාවකදී මෙම මාර්ගෝපදේශය වැරදියි කියා පැවසීමට ඔබට හැකියාවක් නොමැති නම් සහ ඔබ නිවැරදි බව ඔබටම ඔප්පු කර ගත නොහැකි නම් $ U රීතිය}

එහිදී, ඔබට ls{U RULE of වෙනුවට "කිසි විටෙකත් ප්‍රතිදානය විග්‍රහ නොකරන්න" ආදේශ කළ හැකිය . :)

ඔව්, ඇත්ත! ප්‍රතිදානය විග්‍රහ කිරීම ගැන කුමක් කිවls හැකිද?

හොඳයි, ඉතින්, ඒ සියල්ල ලබා දී ... මම හිතන්නේ මෙම රීතිය හොඳ එකක් බව පැහැදිලිය. පළමුවෙන්ම, ඉහත විස්තර කර ඇති පරිදි සැබෑ රීතිය මුග්ධ බව තේරුම් ගත යුතුය ...

එහෙත්, තව දුරටත්, එය කිසියම් විශේෂිත අවස්ථාවක දී, එය බිඳ දැමිය හැකි දැයි දැන ගැනීමට ඔබ ෂෙල් ස්ක්‍රිප්ටින් සමඟ ඉතා හොඳ විය යුතුය. ඔබ එය පරීක්‍ෂා කිරීමේදී එය බිඳ දැමීමට උත්සාහ කරන විට එය වැරදී ඇති බව පැවසීමට තරම් නිපුණතාවයක් අවශ්‍ය වේ . තවද, එවැනි ලිපි නැරඹීමට ඉඩ ඇති ප්‍රේක්ෂකයින්ගෙන් බහුතරයකට (of ප්‍රතිදානය විග්‍රහ නොකරන්න ls! Like වැනි උපදෙස් ලබා දීම ) එවැනි දේ කළ නොහැකි බව මම විශ්වාසයෙන් කියමි. එවැනි දක්ෂතා ඇති අයට එය වැටහෙනු ඇත. ඔවුන් එය තනිවම හදුනාගෙන කෙසේ හෝ නීතිය නොසලකා හරියි.

නමුත් ... මෙම ප්‍රශ්නය දෙස බලන්න, සහ කුසලතා ඇති අය පවා එසේ කිරීම නරක ඇමතුමක් යැයි සිතුවේ කෙසේද; වර්තමාන හොඳම උදාහරණය වෙත ළඟා වීමට ප්‍රශ්නයේ කතුවරයා කොපමණ උත්සාහයක් දැරුවාද! අමාරු ගැටලුවක් සම්බන්ධයෙන් මම ඔබට සහතික වෙමි, එහි සිටින පුද්ගලයින්ගෙන් 99% ක් එය වැරදියට වටහා ගනු ඇති අතර ඉතා නරක ප්‍රති results ල ලබා ගත හැකිය ! තීරණය කරන ක්‍රමවේදය හොඳ ක්‍රමයක් බවට පත් වුවද; එය (හෝ වෙනත්) lsවිග්‍රහ කිරීමේ අදහස සමස්තයක් ලෙස තොරතුරු තාක්‍ෂණ / සංවර්ධක ජනතාව විසින් සම්මත කර ගන්නා තෙක් , බොහෝ පරීක්ෂණ වලට (විශේෂයෙන් කාලය පිළිබඳ පරීක්ෂණයට) ඔරොත්තු දෙන අතර, අවසාන වශයෙන්, 'පොදු තාක්‍ෂණික' තත්වයකට උපාධිය ලබා ගැනීමට සමත් වන තෙක්, බොහෝ අය එය උත්සාහ කර වැරදියට තේරුම් ගත හැකිය ... විනාශකාරී ප්‍රතිවිපාක සමඟ.

ඒ නිසා, මම එක් පසුගිය කාලය .... නැවත නැවතත් කියා ඇත, බව විශේෂයෙන් මෙම නඩුවේ , ඇයි " කවදාවත් parse lsප්රතිදානය!" එය වාක්‍ය ඛණ්ඩයට සුදුසුම ක්‍රමයයි.

[2014-05-18 යාවත්කාලීන කිරීම: OP වෙතින් අදහස් දැක්වීමකට ප්‍රතිචාර දැක්වීම සඳහා (ඉහළ) පිළිතුර සඳහා පැහැදිලි තර්ක; පහත සඳහන් එකතු කිරීම ඊයේ සිට ප්‍රශ්නයට OP එකතු කිරීම් වලට ප්‍රතිචාරයක් ලෙස]

[2014-11-10 යාවත්කාලීන කරන්න: ශීර්ෂ එකතු කිරීම සහ ප්‍රතිසංවිධානය කළ / ප්‍රතිනිර්මාණය කළ අන්තර්ගතය; නැවත සකස් කිරීම, නැවත ලිවීම, පැහැදිලි කිරීම සහ um ... "සංක්ෂිප්ත-ඉෆයිං" ... මම මෙය අදහස් කළේ එය සුළු වශයෙන් ප්‍රතිසංස්කරණයක් බවට පත් වුවද පිරිසිදු කිරීමක් ලෙස ය. මම එය කණගාටුදායක තත්වයක තබා ඇති බැවින් මම ප්‍රධාන වශයෙන් එයට යම් නියෝගයක් දීමට උත්සාහ කළෙමි. පළමු කොටස බොහෝ දුරට නොවෙනස්ව පැවතීම වැදගත් යැයි මට හැඟුණි; එබැවින් එහි සුළු වෙනස්කම් දෙකක් පමණක් ඇති අතර, අතිරික්ත 'නමුත්' ඉවත් කර 'සහ' එය 'අවධාරණය කරයි.]

Original මා මුලින් මෙය අදහස් කළේ මගේ මුල් පිටපත පිළිබඳ පැහැදිලි කිරීමක් ලෙස ය; නමුත් පරාවර්තනය මත වෙනත් එකතු කිරීම් තීරණය කළේය

On තනතුරු පිළිබඳ මාර්ගෝපදේශ සඳහා https://unix.stackexchange.com/tour බලන්න


2
කිසි විටෙකත් මුග්ධ නොවේ. මෙය කිසිම දෙයකට පිළිතුරක් නොවේ.
mikeserv

1
හ්ම්. හොඳයි, මෙම පිළිතුර තෘප්තිමත් වේදැයි මම නොදනිමි, නමුත් එය මතභේදාත්මක වනු ඇතැයි මම කිසිසේත් අපේක්ෂා නොකළෙමි . හා, මම (කිරීමට අදහස්) නෑ 'කවදාවත්' තර්ක ගත් විට සෙන්දගශයෙහි; නමුත් "කිසි විටෙකත් එක්ස් කරන්න එපා!" මුග්ධ භාවිතයකි . 'කිසි විටෙකත් / විග්‍රහ නොකරන්න' යනුවෙන් පෙන්විය හැකි පොදු අවස්ථා දෙකක් මම දකිමි ls. නිවැරදි උපදෙස් වේ: 1. ප්‍රතිදානය විග්‍රහ කළ හැකි සෑම භාවිත අවස්ථාවකම lsවෙනත් විසඳුමක් ඇති බව නිරූපණය කරන්න ( එසේ නොකර) යම් ආකාරයකින් උසස්. 2. උපුටා දක්වන ලද අවස්ථා වලදී ප්‍රකාශය වචනානුසාරයෙන් නොවන බව පෙන්වන්න.
ෂෙලිබුටර්ෆ්ලයි

1
මම ඒ තනතුර පිරිසිදු කළ යුතුයි. තවමත්, කවදාවත් වේ නොහැකි වැකිය එය නිවැරදි මාර්ගය. එය ජනතාව අන් අයට පැවසීම දවසස් සුදුසුකම් සිතන ටිකක් විහිලුවක් කවදාවත් හෝ කරයට පමණක් ඔවුන්ට කියන්න ඔබට එය වැඩ කරනු ඇත මනිරත්නම් ඇයි, නමුත් ඔබ වැඩ ඒ ඇයි මොකක්ද කියලා ඔයා දන්නවාද? -. lsපරිගණක උපයෝගීතාවයකි - ඔබට පරිගණක ප්‍රතිදානය
mikeserv

1
හොඳයි, මම මගේ පසුබෑම ආපසු හැරවූයේ, අවම වශයෙන්, ඔබ සලකුණු කරන දෙය ගැන නිවැරදි නිසා ය. මම අද රාත්‍රියේ හෝ හෙට එය පිරිසිදු කිරීමට උත්සාහ කරමි. මගේ අදහස නම් මම බොහෝ කේත උදාහරණ අනුමාන පිළිතුරකට ගෙන යනු ඇත. එහෙත්, එය තවමත් සඳහන් කර ඇති පරිදි, බොහෝ විට සඳහන් කර ඇති බ්ලොග් සටහනේ ඇති සාවද්‍යතාවයන් නිදහසට කරුණක් නොවේ. මිනිසුන් පොෂ් අත්පොත උපුටා දැක්වීම මුළුමනින්ම නවත්වනු ඇතැයි මම ප්‍රාර්ථනා කරමි
පොසික්ස්

1
ප්‍රවාදයට හසු වීම පිළිබඳ විශිෂ්ට කරුණු. ස්ටැක් එක්ස්චේන්ජ් හි එවැනි ප්‍රශ්න සඳහා වඩාත්ම ප්‍රයෝජනවත් පිළිතුරු වන්නේ "ඔබට අවශ්‍ය නම් මෙන්න, මෙන්න ඔබ සාමාන්‍යයෙන් නොකළ යුත්තේ ඇයි සහ එය වඩා හොඳින් කරන්නේ කෙසේද යන්න පිළිබඳ උදාහරණ කිහිපයක්." "ඔබ කවදා හෝ එසේ කරන්නේ ඇයි" හෝ "එසේ නොකරන්නේ" යන පිළිතුරු සහ අදහස් බොහෝමයක් මට පෙනේ, ඒවා හොඳ නමුත් OP පිළිතුරු නොවේ. ඉතා සුවිශේෂී සිද්ධියක් නිසා සමාන ප්‍රශ්නයක් ඇති පුද්ගලයින් බොහෝ විට පැකිලෙන අතර විශුද්ධිය අවශ්‍ය නොවේ.
බීජෝර්

16

lsසමහර අවස්ථාවල ප්‍රතිදානය විග්‍රහ කළ හැකිද? ෂුවර්. නාමාවලියකින් ඉනෝඩ අංක ලැයිස්තුවක් උකහා ගැනීමේ අදහස හොඳ උදාහරණයකි - ඔබේ ක්‍රියාත්මක කිරීමේ lsසහය ඔබ දන්නේ නම් -q, එම නිසා සෑම ගොනුවක්ම හරියටම එක් නිමැවුම් රේඛාවක් නිපදවනු ඇති අතර ඔබට අවශ්‍ය වන්නේ ඉනෝඩ සංඛ්‍යා පමණි, ඒවා විග්‍රහ කිරීම ls -Rai1qප්‍රතිදානය නිසැකවම හැකි විසඳුමකි. ඇත්ත වශයෙන්ම, කතුවරයා මීට පෙර "කිසි විටෙකත් ls හි ප්‍රතිදානය විග්‍රහ නොකරන්න" වැනි උපදෙස් දැක නොමැති නම්, ඔහු බොහෝ විට ඒවායේ නව රේඛා සහිත ගොනු නාමයන් ගැන නොසිතනු ඇති අතර බොහෝ විට එහි ප්‍රති q ලයක් ලෙස 'q' අතහැර දමනු ඇත. කේතය එම අද්දරදී සියුම් ලෙස කැඩී යනු ඇත - එබැවින්, විග්‍රහ කිරීමේ 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උපකාරී වේද? ගොනු නාමයේ එකම ස්ථානයක මුද්‍රණය කළ නොහැකි අක්ෂරයක් අඩංගු විවිධ ලිපිගොනු 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.


ඔහ් ප්‍රමාණය ගැන ඇත්ත - මම උත්සාහ කළොත් මට එය කළ හැකිය - එසේ විය යුතුද? මම ඔබගේ පිළිතුර මෙන් ඔබ කියන්න දන්නේ නැහැ නිසා - ටිකක් මහන්සියි හෝ මෙම මුළු දෙයක් im නොහැකි හෝ කරයට හෝ කවදාවත් නමුත් ඇත්තටම සමහර විට උදාහරණ දෙන්න ඇයි නැත්තේ හා සංසන්දනාත්මක ආකාරය වෙන - ඔබට ස්තුතියි.
mikeserv

මම හිතන්නේ ඔබ උත්සාහ කළා නම්, ඔබ සිතනවාට වඩා එය දුෂ්කර බව ඔබ සොයා ගනීවි. ඉතින්, ඔව්, මම නිර්දේශ කරමි. මට ඒවා ගැන සිතිය හැකි තාක් කල් ඔබ වෙනුවෙන් කඩාවැටෙන ගොනු නාමයන් ලබා දීම ගැන මම සතුටු වෙමි. :)
දේවභක්තික

අදහස් දීර් discussion සාකච්ඡාවක් සඳහා නොවේ; මෙම සංවාදය චැට් කිරීමට ගෙන ගොස් ඇත .
ටර්ඩන්

ikmikeserv සහ godlygeek, මම මෙම අදහස් ත්‍රෙඩ් එක කතාබස් කිරීමට ගෙන ගියෙමි . කරුණාකර අදහස් දැක්වීමේදී මෙවැනි දීර් discussions සාකච්ඡා නොකරන්න, එය චැට් සඳහා වේ.
ටර්ඩන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.