මම නිරතුරුවම උපුටා දක්වමින් පිළිතුරු බලන්න , මෙම සබැඳිය නිශ්චිතව ප්රකාශ "කරන්න පේළියේ ls
!" මෙය හේතු කිහිපයක් නිසා මට කරදර කරයි:
අනියම් කියවීමේදී අවම වශයෙන් දෝෂ කිහිපයක්වත් මට තෝරා ගත හැකි වුවද, එම සබැඳියේ තොරතුරු තොග වශයෙන් පිළිගෙන ඇති බව පෙනේ.
එම සබැඳියේ දක්වා ඇති ගැටළු වලට විසඳුමක් සෙවීමට කිසිදු ආශාවක් ඇති නොවූ බවක් පෙනේ.
පළමු ඡේදයෙන්:
... ඔබ
[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 නිශ්චිත විකල්පයකි.
stat
සෑම ගොනුවක්ම තිබේද යන්න සැබවින්ම පරික්ෂා කරන බැවින් මම මගේ පිළිතුරෙහි භාවිතා කළේ මේ නිසාය . sed
කාරණය සමඟ ඔබේ පතුලේ වැඩ කරන්නේ නැත.
ls
වන්නේ කෙසේද? ඔබ විස්තර කරන දේ ඉතා දුෂ්කර ය. ඒ සියල්ල තේරුම් ගැනීමට මට එය නැවත සකස් කිරීමට අවශ්ය වන අතර මම සාපේක්ෂව දක්ෂ පරිශීලකයෙක්මි. ඔබේ සාමාන්ය ජෝට මේ වගේ දෙයක් සමඟ ගනුදෙනු කිරීමට හැකි වේ යැයි බලාපොරොත්තු විය නොහැක.
ls
ප්රතිදානය විග්රහ කිරීම වැරදි වීමට හේතු සියල්ලම මුල් සබැඳිය තුළ හොඳින් ආවරණය වී ඇත (සහ වෙනත් බොහෝ ස්ථානවල). OP එය තේරුම් ගැනීමට උදව් ඉල්ලා සිටියේ නම් මෙම ප්රශ්නය සාධාරණ වනු ඇත, නමුත් ඒ වෙනුවට OP උත්සාහ කරන්නේ ඔහුගේ වැරදි භාවිතය නිවැරදි බව ඔප්පු කිරීමට ය.
time bash -c 'for i in {1..1000}; do ls -R &>/dev/null; done'
= 3.18s vstime bash -c 'for i in {1..1000}; do echo **/* >/dev/null; done'
= 1.28s