බාෂ් ෂෙල් ස්ක්‍රිප්ටයක නාමාවලියක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද?


3731

බාෂ් ෂෙල් ස්ක්‍රිප්ට් එකක් තුළ ඩිරෙක්ටරියක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට භාවිතා කළ හැකි විධානය කුමක්ද?

Answers:


5159

ෂෙල් ස්ක්‍රිප්ට් එකක ඩිරෙක්ටරියක් තිබේදැයි පරීක්ෂා කිරීමට, ඔබට පහත සඳහන් දෑ භාවිතා කළ හැකිය:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

නැතහොත් නාමාවලියක් නොපවතී දැයි පරීක්ෂා කිරීමට:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

කෙසේ වෙතත්, ජෝන් එරික්සන් පෙන්වා දෙන පරිදි, නාමාවලියකට සංකේතාත්මක සබැඳියක් ද මෙම චෙක්පත පසුකර යන බව ඔබ සැලකිල්ලට නොගන්නේ නම්, පසු විධාන අපේක්ෂිත පරිදි ක්‍රියා නොකරනු ඇත. උදා: මෙය ක්‍රියාත්මක කිරීම:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

දෝෂ පණිවිඩය නිපදවනු ඇත:

rmdir: failed to remove `symlink': Not a directory

එබැවින් පසු විධාන නාමාවලි අපේක්ෂා කරන්නේ නම් සංකේතාත්මක සබැඳි වෙනස් ආකාරයකින් සැලකිය යුතුය.

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

විචල්යයන් එතීමට භාවිතා කරන ද්විත්ව උපුටා දැක්වීම් විශේෂයෙන් සැලකිල්ලට ගන්න. මේ සඳහා හේතුව තවත් පිළිතුරකින් 8 ජීන් විසින් පැහැදිලි කර ඇත .

විචල්යයන් තුළ අවකාශ හෝ වෙනත් අසාමාන්ය අක්ෂර තිබේ නම් එය බොහෝ විට ස්ක්‍රිප්ට් අසමත් වීමට හේතු වේ.


29
ඔබට එය GNU මෙවලම් සමඟ ආරක්ෂිතව වාදනය කිරීමට අවශ්‍ය නම්, භාවිතය --බෙහෙවින් නිර්දේශ කෙරේ (විකල්පයේ අවසාන සලකුණු). එසේ නොමැතිනම්, ඔබේ විචල්‍යය තුළ විකල්පයක් ලෙස පෙනෙන යමක් තිබේ නම්, ස්ක්‍රිප්ට් අවකාශය මෙන් අසාර්ථක වනු ඇත.
මාක් මුට්ස් - mmutz

2
නවීන සංස්කරණ සඳහා, ksh, ආදිය. [...] යනු
බිල්ඩින්

79
මතක තබා ගත යුතු එක් දෙයක්: [ ! -d "$DIRECTORY" ]සැබෑ වනු ඇත එක්කෝ නම් $DIRECTORYනොපවතියි, හෝ නම් කරන්නේ පවතින නමුත් එය ඩිරෙක්ටරියක් නො වේ. වැනි දෙයක් සලකා බලන්න if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; "$DIRECTORY"ගොනුවක් නම් මෙය අසාර්ථක වනු ඇත . (ඇත්ත වශයෙන්ම ඔබ mkdirකෙසේ හෝ සාර්ථක වී ඇත්දැයි පරීක්ෂා කර බැලිය යුතුය ; එය අසාර්ථක වීමට හේතු ගණනාවක් තිබේ.)
කීත් තොම්සන්

5
චෙක්පත සිදු කළ විගසම වෙනත් ක්‍රියාදාමයන් හේතුවෙන් තත්වය දැනටමත් වෙනස් විය හැකි බව සඳහන් කිරීම වටී. බොහෝ අවස්ථාවන්හීදී නාමාවලිය නිර්මාණය කිරීම හෝ භාවිතා කිරීම වඩා හොඳය.
ඇල්ෆ්

12
ඩිරෙක්ටරිය ( -d) සහ සිම්ලින්ක් ( -L) යන දෙකම පරීක්ෂා කිරීම වෙනුවට , විචල්‍යයට කප්පාදුවක් එකතු කිරීම පහසුය if [ -d "${THING:+$THING/}" ]. ඩිරෙක්ටරියක් අමතර කප්පාදුව ගැන තැකීමක් නොකරයි. ගොනුවක් අසත්‍යයට තක්සේරු කරනු ඇත. හිස් හිස් වනු ඇත, එබැවින් අසත්ය. එහි ගමනාන්තයට සිම්ලින්ක් එකක් විසඳනු ඇත. ඇත්ත වශයෙන්ම, එය ඔබගේ ඉලක්කය මත රඳා පවතී. ඔබට එහි යාමට අවශ්‍ය නම් මෙය හොඳයි. ඔබට එය මකා දැමීමට අවශ්‍ය නම් , මෙම පිළිතුරේ කේතය වඩා හොඳය.
ගොති

532

Bash ස්ක්‍රිප්ට් එකක යොමු කිරීමේදී විචල්‍යයන් ද්විත්ව මිල ගණන් වලින් ඔතා තැබීමට මතක තබා ගන්න. මේ දිනවල ළමයින් වැඩෙන්නේ ඔවුන්ගේ නාමාවලි නාමවල අවකාශ සහ වෙනත් විහිලු චරිත තිබිය හැකිය යන අදහසිනි. (අවකාශය! මගේ කාලයේ, අපට විසිතුරු අවකාශයක් නොතිබුණි!;))

යම් දවසක, එම ළමයින්ගෙන් එක් අයෙකු ඔබගේ ස්ක්‍රිප්ට් එක $DIRECTORYසකසා ඇති "My M0viez"අතර ඔබේ ස්ක්‍රිප්ට් එක පුපුරා යනු ඇත. ඔබට එය අවශ්‍ය නැත. එබැවින් මෙය භාවිතා කරන්න.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

9
ද්විත්ව උපුටා දැක්වීම් භාවිතා කිරීමට තවත් හේතුවක් නම් කිසියම් හේතුවක් නිසා DIRECTORY සකසා නොමැති වීමයි.
ජෝන් එරික්සන්

2
"සෑම විටම විචල්යයන් ද්විත්ව උපුටා දැක්වීම් වලින් ආවරණය කරන්න ... [[...]] භාවිතා කරන විට තාක්ෂණික වශයෙන් අවශ්‍ය නොවේ; tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS බලන්න (සටහන: වචන බෙදීමක් නැත): "[[]] අතර ගොනු නාම පුළුල් කිරීමක් හෝ වචන බෙදීමක් සිදු නොවේ, නමුත් පරාමිති ප්‍රසාරණය සහ විධාන ආදේශනය ඇත."
මයිකල්

2
යුනික්ස් / ලිනක්ස් හි නාමාවලිවල කිසිදු හිස් අවකාශයක් නොතිබිය යුතු අතර පසුව ස්ක්‍රිප්ට් එයට අනුගත නොවිය යුතුය. වින්ඩෝස් ස්ක්‍රිප්ටින්හි සියලු ප්‍රතිවිපාක සමඟ වින්ඩෝස් එයට සහය දැක්වීම නරක ය, නමුත් කරුණාකර, ඕනෑම දෙයකට ආදරය කිරීම සඳහා අනවශ්‍ය අවශ්‍යතා හඳුන්වා දීම අවශ්‍ය නොවේ.
tvCa

18
vtvCa සංවර්ධකයින් සඳහා දේවල් පහසු කරවීමට බල කරනවාට වඩා පරිශීලකයින් සාමාන්‍යයෙන් ඔවුන්ගේ නාමාවලි නාමයන්හි වඩාත් නම්‍යශීලී වීමට ඉඩ දෙන බව මට පෙනී ගියේය. (ඇත්ත වශයෙන්ම, දිගු ගොනු නාමයන් සමඟ කටයුතු කරන විට, මම හිස් තැන් නොමැතිව අය වචනය ඔතන මරනවා මම තිර රචනා හා වැඩසටහන් හිස් අවකාශයක් මාර්ග සඳහා ගිණුම්ගත නොකිරීමට සිට අතීතයේ දී සිදු වී ඇති නමුත් ලෙස වේදනාව විය සොයා.)
එන්නත

2
හා. අවකාශය යනු සාමාන්‍යයෙන් ග්ලයිෆස් නොමැති අක්ෂර පමණි. කෙසේ හෝ ඔබට බැක්ස්ලෑෂ් එකකින් පැන යා හැකිය.
uchuugaka

228

-D පරීක්ෂණයෙන් පුදුම සහගත ප්‍රති results ල ලබා ගත හැකි බව සලකන්න :

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

ගොනුව යටතේ: "නාමාවලිය නාමාවලියක් නොවන්නේ කවදාද?" පිළිතුර: "එය නාමාවලියකට සමමුහුර්ත වූ විට." තරමක් ගැඹුරු පරීක්ෂණයක්:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Bash කොන්දේසි සහිත ප්‍රකාශන සහ [බිල්ඩින් විධානය සහ [[සංයුක්ත විධාන පිළිබඳ Bash අත්පොතෙන් ඔබට වැඩි විස්තර සොයාගත හැකිය .


12
හෝ, ඩිරෙක්ටරි මත වැඩ කිරීම පමණක් අවශ්‍ය යැයි උපකල්පනය කිරීම (සහ සබැඳි නොසලකා හැරිය හැක) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... හෝ, සබැඳි සහ ඩයර්ස් යන දෙකෙහිම ක්‍රියාත්මක වන එක් විධානයක් සඳහා:rm -r tmpdir
මයිකල්

218

තාර්කික පරීක්ෂණ ලිවීම වඩාත් ස්වාභාවික බවට පත්කිරීමේ ද්විත්ව වරහන අනුවාදය මට පෙනේ test:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

සඳහා if [[ -d "$TARFILE" ]]මම අරගෙන යනවා [[: සොයා ගැනීමට නොහැකි
TheVillageIdiot

15
VTheVillageIdiot සහ edHedgehog, ඔබ භාවිතා කරන්නේ bash shell ද? ද්විත්ව වරහන විශ්වීය ලෙස සහාය නොදක්වයි. මෙන්න එම අවස්ථාවේදී SO පිළිතුරක්: stackoverflow.com/questions/669452/…
yukondude

6
පෙරනිමි සම්පාදක විකල්පයන් සහිත කාර්යබහුල පෙට්ටියේ අළු [[ ]]සඳහා සහය දක්වයි, නමුත් ඇත්ත වශයෙන්ම ඊට වෙනස් ක්‍රියාකාරිත්වයක් සපයන්නේ නැත [ ]. අතේ ගෙන යා හැකි බව සැලකිලිමත් වන්නේ නම්, [ ]අවශ්‍ය ක්‍රියාමාර්ග සමඟ බැඳී සිටින්න .
dubiousjim

6
... සහ shell කේත රචනය තුල bash නිර්මාණය කරන භාවිතා කරන්නේ නම්, ස්ක්රිප්ට් පළමු මාර්ගය විය යුතුය:! # / bin / bash (! නොව # / bin / sh, ksh, ආදී)
මයිකල්

ද්විත්ව වර්ග වරහන් වර්‍ගයේදී භාවිතා කරන විට, ඔබට විචල්‍යයන් උපුටා දැක්වීමට අවශ්‍ය නොවේ.
හියුබට් ග්‍රෙස්කොවියාක්

157

කෙටි ආකෘතිය:

[ -d "$DIR" ] && echo "Yes"

6
මේ වගේ මේ වැඩ කරන්නේ: if $dir is a dir, then echo "yes"? ටිකක් පැහැදිලි කිරීමක් උපකාරී වනු ඇත :)
මාර්ටිජන්

5
cmd && otherසඳහා පොදු කෙටිමං වේ if cmd; then other; fi- මෙය බූලියන් තර්කනයට සහය දක්වන බොහෝ ක්‍රමලේඛන භාෂාවන් සමඟ ක්‍රියා කරන අතර එය කෙටි පරිපථ ඇගයීම ලෙස හැඳින්වේ .
ත්‍රිත්ව

1
යටතේ හැසිරීම සමාන නොවේ set -e(එය ෂෙල් ක්‍රමලේඛනය හොඳම පුහුණුවකි ).
ඩොල්මන්

1
ol ඩොල්මන් [ -d "$DIR" ]පරීක්‍ෂා කර ඇත (පසුව && echo Yes), එබැවින් set -eස්ක්‍රිප්ට් හැසිරීමට කිසිදු වෙනසක් සිදු නොවන බව මම විශ්වාස කරමි (එනම් පරීක්ෂණය අසමත් වුවහොත් ස්ක්‍රිප්ට් සාමාන්‍යයෙන් ඉදිරියට යයි).
tzot

132

නාමාවලියක් තිබේදැයි පරීක්ෂා කිරීමට ඔබට ifමෙවැනි සරල ව්‍යුහයක් භාවිතා කළ හැකිය :

if [ -d directory/path to a directory ] ; then
# Things to do

else #if needed #also: elif [new condition]
# Things to do
fi

ඔබට එය negative ණාත්මකව කළ හැකිය:

if [ ! -d directory/path to a directory ] ; then
# Things to do when not an existing directory

සටහන : ප්‍රවේශම් වන්න. විවෘත කිරීමේ සහ වසා දැමීමේ වරහන් දෙපස හිස් අවකාශයන් තබන්න.

එකම සින්ටැක්ස් සමඟ ඔබට භාවිතා කළ හැකිය:

-e: any kind of archive

-f: file

-h: symbolic link

-r: readable file

-w: writable file

-x: executable file

-s: file size greater than zero

ලිපිගොනු ස්විචයන් සමඟ මාතෘකාවෙන් බැහැරව යාම හැර, 2008 සිට පිළිගත් පිළිතුරට වඩා මෙය හොඳ වන්නේ කෙසේද?
ඩෑන් ඩස්කලෙස්කු

වඩා හොඳයි, [! -d බහලුම /
බහලුමකට යන

109
  1. නාමාවලියක් හෝ ගොනුවක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා සරල පිටපතක්:

    if [ -d /home/ram/dir ]   # For file "if [-f /home/rama/file]"
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
  2. නාමාවලිය තිබේද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා සරල පිටපතක්:

    mkdir tempdir   # If you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi

    ඉහත ස්ක්‍රිප්ට් මඟින් ඩිරෙක්ටරිය තිබේද නැද්ද යන්න පරීක්ෂා කරනු ඇත

    $? අවසාන විධානය සාර්ථක නම් එය "0" ලබා දෙයි, නැතිනම් ශුන්‍ය නොවන අගයක්. tempdirදැනටමත් තිබේ යැයි සිතමු . එවිට mkdir tempdirපහත දැක්වෙන පරිදි දෝෂයක් ලබා දෙනු ඇත:

    mkdir: 'tempdir' නාමාවලිය සෑදිය නොහැක: ගොනුව පවතී


4
ඩිරෙක්ටරිය මුලින් නොතිබුනේ නම් දෙවැන්න නිර්මාණය කරයි. එවිට එය මෝඩකමක් නොවේ.
ෂිහේ ෂැං

. දෙවැන්න භයානක බව පෙනේ. එය නාමාවලිය නිර්මාණය කරන බැවින්, ඩර් නොපවතින බව තවදුරටත් සත්‍ය නොවේ.
ක්‍රිස්

92

ඔබට භාවිතා කළ හැකිය test -d(බලන්න man test).

-d file ගොනුවක් තිබේ නම් එය නාමාවලියකි.

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

test -d "/etc" && echo Exists || echo Does not exist

සටහන: testවිධානය කොන්දේසි සහිත ප්‍රකාශනයකට සමාන වේ [(බලන්න :) man [, එබැවින් එය ෂෙල් ස්ක්‍රිප්ට් හරහා අතේ ගෙන යා හැකිය.

[- මෙය testබිල්ඩින් සඳහා සමාන පදයකි, නමුත් අවසාන තර්කය, විවරයට ]ගැලපෙන පරිදි වචනාර්ථයෙන් විය යුතුය [.

හැකි විකල්ප හෝ වැඩිදුර උදව් සඳහා, පරීක්ෂා කරන්න:

  • help [
  • help test
  • man test හෝ man [

55

හෝ සම්පූර්ණයෙන්ම නිෂ් less ල දෙයක් සඳහා:

[ -d . ] || echo "No"

6
එය කිසි විටෙකත් "නැත" මුද්‍රණය නොකරනු ඇත. වෙනත් ත්‍රෙඩ් එකකින් හෝ වෙනත් ආකාරයකින් මකා දැමුවේ නැත්නම් වත්මන් ඩිරෙක්ටරිය සැමවිටම පවතී.
ජාහිඩ්

පරිපූර්ණ නියැදිය :) පිළිගත් පිළිතුරට සාපේක්ෂව සමහර පිළිතුරු කෙතරම් අද්විතීයද යන්න
සර්ජි සර්ග්ස්යාන්

4
මෙය මෙතරම් වාර ගණනක් ඉහළ නංවා ඇත්තේ ඇයි? එය ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත.
codeforester


52

මෙන්න ඉතා ප්‍රායෝගික මෝඩකමක්:

(cd $dir) || return # Is this a directory,
                    # and do we have access?

මම සාමාන්‍යයෙන් එය ශ්‍රිතයකින් ඔතා:

can_use_as_dir() {
    (cd ${1:?pathname expected}) || return
}

හෝ:

assert_dir_access() {
    (cd ${1:?pathname expected}) || exit
}

මෙම ප්‍රවේශයේ ඇති හොඳ දෙය නම් මට හොඳ දෝෂ පණිවිඩයක් ගැන සිතිය යුතු නැත.

cdදැනටමත් සම්මත දෝෂ සඳහා සම්මත එක් පේළියේ පණිවිඩයක් මට ලබා දෙනු ඇත. එය මට සැපයිය හැකි ප්‍රමාණයට වඩා වැඩි තොරතුරු ලබා දෙනු ඇත. හොඳින් ඉටු cdතුල උප කබොළ( ... ) , මෙම විධානය එම දුරකථන ඇමතුම වත්මන් බහලුම බලපාන නීතියක් නොවේ. ඩිරෙක්ටරිය පවතින්නේ නම්, මෙම උපසිරැසිය සහ ශ්‍රිතය කිසිදු විවරණයක් නොවේ.

ඊළඟට අප ඉදිරිපත් කරන තර්කය cd:${1:?pathname expected} . මෙය වඩාත් සවිස්තරාත්මක පරාමිති ආදේශනයකි, එය වඩාත් විස්තරාත්මකව පහත විස්තර කෙරේ.

Tl; dr: මෙම ශ්‍රිතයට ඇතුල් වූ නූල හිස් නම්, අපි නැවතත් උපසිරැසියෙන් ඉවත් වී ( ... )ලබා දුන් දෝෂ පණිවිඩය සමඟ ශ්‍රිතයෙන් ආපසු යමු .


ksh93මෑන් පිටුවෙන් උපුටා දැක්වීම :

${parameter:?word}

නම් parameter තබා නොවන ශූන්ය වේ නම් එහි අගය ආදේශ; එසේ wordනොමැතිනම් , කවචයෙන් මුද්‍රණය කර පිටවන්න (අන්තර්ක්‍රියාකාරී නොවේ නම්). wordමඟ හැරී ඇත්නම් සම්මත පණිවිඩයක් මුද්‍රණය කෙරේ.

හා

:ඉහත ප්‍රකාශන වලින් මහා බඩවැල ඉවත් කර ඇත්නම්, කවචය පරික්ෂා කරන්නේ පරාමිතිය සකසා තිබේද නැද්ද යන්න පමණි.

wordහිස් අවකාශය ඇතුළුව ඕනෑම සාධාරණ නූලකට යොමු විය හැකි පරිදි මෙහි වාක්‍ය ඛණ්ඩය ෂෙල් ප්‍රලේඛනයට සුවිශේෂී වේ .

මෙම විශේෂිත අවස්ථාවෙහිදී, සම්මත දෝෂ පණිවිඩය 1: parameter not setප්‍රමාණවත් නොවන බව මම දනිමි , එබැවින් අපි මෙහි අපේක්ෂා කරන අගය - pathnameනාමාවලියක විශාලනය කරමි .

දාර්ශනික සටහනක්:

කවචය වස්තු නැඹුරු භාෂාවක් නොවේ, එබැවින් පණිවිඩය පවසන්නේ pathnameනැත directory. මෙම මට්ටමේ දී, මම එය සරලව තබා ගැනීමට කැමැත්තෙමි - ශ්‍රිතයක් සඳහා වන තර්ක නූල් පමණි.


මෙය පැවැත්ම පරීක්ෂා කිරීමට වඩා වැඩි යමක් කරයි: මෙය ඔබගේ පරිශීලක මට්ටමින් ප්‍රවේශය සඳහා පරීක්ෂා කරයි. SO ප්‍රශ්න ස්ථාවරය පැවැත්ම සඳහා පමණි. test -d@Grundlefleck පැහැදිලි කළ පරිදි නිවැරදි පිළිතුර .
එෆ්. හවුරි

7
@ එෆ්. හවුරි - ඔහු තවත් කිසිවක් ඉල්ලා සිටියේ නැත, එය සත්‍යයකි. කෙසේ වෙතත්, මම සාමාන්‍යයෙන් ඊට වඩා දැනගත යුතු බව මට පෙනී ගියේය.
හෙන්ක් ලැන්ග්වෙල්ඩ්

කිසිදු පරීක්ෂණයක් මූලයක් ලෙස ක්‍රියාත්මක නොවන්නේ නම් එය නිගමනය කළ නොහැකි බව මට කිසි විටෙකත් සිදු නොවීය. test -d /unreadable/existsතර්කය පැවතුනද එය අසාර්ථක වනු ඇත.
හෙන්ක් ලැන්ග්වෙල්ඩ්

36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

ඉහත කේතය මඟින් ඩිරෙක්ටරිය තිබේද සහ එය ලිවිය හැකිදැයි පරීක්ෂා කරයි.


1
-a ට සමාන වේ -e. එය "අතහැර දමා" ඇති අතර එහි භාවිතය අධෛර්යමත් වේ.
CousinCocaine

27
DIRECTORY=/tmp

if [ -d "$DIRECTORY" ]; then
    echo "Exists"
fi

මාර්ගගතව උත්සාහ කරන්න


remeber spaceafter [-> [`` -d . අවකාශය
නැතිවීම

4
නැවත මේ පිළිතුර මේ වන විටත් 2008 දී, වඩා ප්රයෝජනවත් පැහැදිලි කිරීම් සමග ලබා දී ඇත. මෙහි ඇති එකම අලුත් දෙය වන්නේ මාර්ගගත ක්‍රීඩා පිටියයි.
ඩෑන් ඩස්කලෙස්කු


21

භාවිතා කරමින් තවත් විශේෂාංග find

  • උප නාමාවලි තුළ ඇති ෆෝල්ඩරයේ පැවැත්ම පරීක්ෂා කරන්න:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
  • වත්මන් නාමාවලිය තුළ රටාවක් මත පදනම්ව ෆෝල්ඩර එකක් හෝ කිහිපයක් තිබේදැයි පරීක්ෂා කරන්න:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
  • සංයෝජන දෙකම. පහත උදාහරණයේ දී, එය වත්මන් නාමාවලියෙහි ඇති ෆෝල්ඩරයේ පැවැත්ම පරීක්ෂා කරයි:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi

හායි නීල්. වැනි රටාවක් මත පදනම්ව නාමාවලි වල පැවැත්ම පරීක්ෂා කිරීමට ඔබේ අදහස ප්‍රයෝජනවත් විය හැකිය : find -maxdepth 1 -type d -name 'pattern'. මම ඔබේ පිළිතුරට මෙම උපක්‍රමය එකතු කළහොත් ඔබට කමක් නැද්ද? චියර්ස්;)
ඔලිබ්‍රේ

20

ඇත්ත වශයෙන්ම, වෙඩි නොවදින ප්‍රවේශයක් ලබා ගැනීම සඳහා ඔබ මෙවලම් කිහිපයක් භාවිතා කළ යුතුය:

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # Now you're testing
    echo "It's a dir";
fi

ඔබ භාවිතා කරන තාක් කල් අවකාශ සහ විශේෂ චරිත ගැන කරදර වීමට අවශ්‍ය නැත "${}".

[[]]එය එතරම් අතේ ගෙන යා නොහැකි බව සලකන්න [], නමුත් බොහෝ අය නවීන බාෂ් අනුවාද සමඟ වැඩ කරන බැවින් (සියල්ලට පසු, බොහෝ අය විධාන රේඛාව සමඟ පවා ක්‍රියා නොකරයි :-p), කරදරයට වඩා ප්‍රතිලාභ වැඩි ය.


17

ifඔබ පිම්මට පෙර බැලීමට වඩා ඔබට කිරීමට අවශ්‍ය ඕනෑම දෙයක් කිරීම ගැන ඔබ සිතුවාද?

එනම්, ඔබ ඩිරෙක්ටරියක් ඇතුළු වීමට පෙර එහි පැවැත්ම පරීක්ෂා කිරීමට අවශ්‍ය නම්, මෙය කිරීමට උත්සාහ කරන්න:

if pushd /path/you/want/to/enter; then
    # Commands you want to run in this directory
    popd
fi

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

මෙය ඔබට වඩා හොඳ බව පෙනේ, එය ඔබම පුනරාවර්තනය කිරීම අවශ්‍ය වේ:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # Commands you want to run in this directory
    popd
fi

එකම දෙයක් සමඟ කටයුතු කරන cd, mv, rmඔබ සිටිනා නැති බව ගොනු මත උත්සාහ නම්, ඔවුන් දෝෂයක් සමග පිටවී එය නොපවතියි, සහ ඔබේ පණිවුඩය මුද්රණය කරන්නම් ආදිය, ... thenවාරණ මඟහැරේ වනු ඇත. පවතින ලිපිගොනු වල ඔබ ඒවා උත්සාහ කළහොත්, විධානය ක්‍රියාත්මක වන අතර තත්වයෙන් පිටව යනු ඇත 0, එමඟින් ඔබේ thenවාරණය ක්‍රියාත්මක කිරීමට ඉඩ ලබා දේ.


2
pushd යනු මෙය කිරීමේ වඩාත් අලංකාර ක්‍රමයයි. මම එය පිළිතුරක් ලෙස පළ කිරීමට
සූදානම්ව සිටියෙමි

16
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

සැ.යු: විචල්‍යයන් උපුටා දැක්වීම හොඳ පුරුද්දකි.

පැහැදිලි කිරීම:

  • -d: එය නාමාවලියක් දැයි පරීක්ෂා කරන්න
  • -L: එය සංකේතාත්මක සබැඳියක් දැයි පරීක්ෂා කරන්න

පැහැදිලි කිරීමක් පිළිවෙලට වනු ඇත ( ඔබේ පිළිතුර සංස්කරණය කිරීමෙන් මිස අදහස් දැක්වීම් වලින් නොවේ).
පීටර් මෝර්ටෙන්සන්

15

නාමාවලි එකකට වඩා පරීක්ෂා කිරීමට මෙම කේතය භාවිතා කරන්න:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

එය නොපවතින බව ඔබ පරීක්ෂා කරන්නේ කෙසේද?
perrohunter

15

නාමාවලිය තිබේදැයි පරීක්ෂා කරන්න, නැතිනම් එකක් සාදන්න:

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

16
ඔබට mkdir -p "$DIRECTORY"එකම බලපෑමක් සඳහා භාවිතා කළ හැකිය .
ලෝගන් පිකප්


11

මෙම පිළිතුර ෂෙල් පිටපතක් ලෙස ඔතා ඇත

උදාහරණ

$ is_dir ~                           
YES

$ is_dir /tmp                        
YES

$ is_dir ~/bin                       
YES

$ mkdir '/tmp/test me'

$ is_dir '/tmp/test me'
YES

$ is_dir /asdf/asdf                  
NO

# Example of calling it in another script
DIR=~/mydata
if [ $(is_dir $DIR) == "NO" ]
then
  echo "Folder doesnt exist: $DIR";
  exit;
fi

is_dir

function show_help()
{
  IT=$(CAT <<EOF

  usage: DIR
  output: YES or NO, depending on whether or not the directory exists.

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

DIR=$1
if [ -d $DIR ]; then 
   echo "YES";
   exit;
fi
echo "NO";

10

-eචෙක්පත භාවිතා කිරීම ලිපිගොනු සඳහා පරික්ෂා කරනු ඇති අතර මෙයට නාමාවලි ඇතුළත් වේ.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

1
OP හි ප්‍රශ්නයට නිවැරදිව පිළිතුරු සපයන්නේ නැත - එය නාමාවලියක්ද?
මාර්ක් ස්ටුවර්ට්

8

අනුව , ජොනතන් ගේ අදහස්:

ඔබට ඩිරෙක්ටරිය නිර්මාණය කිරීමට අවශ්‍ය නම් එය තවමත් නොපවතී නම්, සරලම තාක්‍ෂණය වන්නේ mkdir -pඩිරෙක්ටරිය නිර්මාණය කරන - සහ නැතිවූ ඕනෑම ඩිරෙක්ටරි මාර්ගයට ඉහළින් භාවිතා කිරීමයි - සහ ඩිරෙක්ටරිය දැනටමත් තිබේ නම් එය අසාර්ථක නොවේ, එබැවින් ඔබට ඒ සියල්ල කළ හැකිය එකවරම:

mkdir -p /some/directory/you/want/to/exist || exit 1

7
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

මෙය සම්පූර්ණයෙන්ම සත්‍ය නොවේ ...

ඔබට එම ඩිරෙක්ටරියට යාමට අවශ්‍ය නම්, ඔබට ඩිරෙක්ටරියේ ක්‍රියාත්මක කිරීමේ අයිතිවාසිකම් ද තිබිය යුතුය. සමහර විට ඔබට ලිවීමේ අයිතිවාසිකම් ද තිබිය යුතුය.

එබැවින්:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi

if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

7

fileවැඩසටහන භාවිතා කරන්න . සියලුම නාමාවලි ලිනක්ස් හි ගොනු ද වන බැවින් පහත විධානය නිකුත් කිරීම ප්‍රමාණවත් වේ:

file $directory_name

නැති ගොනුවක් පරික්ෂා කිරීම: file blah

ප්‍රතිදානය: cannot open 'blah' (No such file or directory)

පවතින නාමාවලියක් පරීක්ෂා කිරීම: file bluh

ප්‍රතිදානය: bluh: directory


1
හොඳ අදහසක්, කෙසේ වෙතත් අවස්ථා දෙකේදීම ගොනු විධානය සෑම විටම 0 පිටවීමේ කේතය ලබා දෙයි. ගොනුව / නාමාවලිය සොයාගත නොහැකි වූ විට :(.
අනතුර 89

6

මෙම lsසමඟ එක්ව විධාන -l(දිගු ලැයිස්තුගත) විකල්පය ප්රතිලාභ ගොනු සහ බහලුම් පිළිබඳ තොරතුරු ගුණාංග. නිමැවුමේ
පළමු අක්‍ෂරය ls -lසාමාන්‍යයෙන් එය a dහෝ a -(ඉරක්) වේ. අd සඳහන් එක් තහවුරු කිරීම සඳහා ලබා දේ.

ලබා දී ඇති ISDIRවිචල්‍යයට ඩිරෙක්ටරියක් සඳහා මාර්ගයක් තිබේද නැද්ද යන්න පහත දැක්වෙන විධානය මඟින් ඔබට කියනු ඇත :

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

ප්‍රායෝගික භාවිතය:

    [claudio@nowhere ~]$ ISDIR="$HOME/Music" 
    [claudio@nowhere ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [claudio@nowhere ~]$ touch "empty file.txt"
    [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" 
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory

+1, නමුත් ISDIR නොපවතින විට ඔබට දෝෂ පණිවිඩයක් මෙන්ම ඔබේ රෝග විනිශ්චය පණිවිඩයද ලැබේ.
ysap


5

ඔබට නාමාවලියක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නම්, එය සත්‍ය නාමාවලියක් හෝ සිම්ලින්ක් එකක් වුවද, මෙය භාවිතා කරන්න:

ls $DIR
if [ $? != 0 ]; then
        echo "Directory $DIR already exists!"
        exit 1;
fi
echo "Directory $DIR does not exist..."

පැහැදිලි කිරීම: "ls" විධානය මඟින් දෝෂයක් ලබා දෙයි "ls: / x: ඩිරෙක්ටරිය හෝ සිම්ලින්ක් නොපවතින නම් එවැනි ගොනුවක් හෝ නාමාවලියක් නොමැත", තවද ඔබට "$?" හරහා ලබා ගත හැකි ආපසු කේතය, non? -Null (සාමාන්‍යයෙන් "1"). "Ls" ඇමතීමෙන් පසු ඔබ කෙලින්ම ආපසු කේතය පරීක්ෂා කිරීමට වග බලා ගන්න.


3
විකල්පයක් ලෙස ඔබට මෙම කෙටි අනුවාදය භාවිතා කළ හැකිය:if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
derFunk

5

(1)

[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"

(2)

[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"

(3)

[[ -d run_dir  && ! -L run_dir ]] && echo Exists || echo "Not Exists"

ඉහත දක්වා ඇති එක් ප්‍රවේශයක් සමඟ ගැටළුවක් හමු වුවහොත්:

lsවිධානය සමඟ ; ඩිරෙක්ටරියක් නොපවතින අවස්ථා - දෝෂ පණිවිඩයක් පෙන්වනු ලැබේ

[[ `ls -ld SAMPLE_DIR| grep ^d | wc -l` -eq 1 ]] && echo exists || not exists

-ksh: not: හමු නොවීය [එවැනි ගොනුවක් හෝ නාමාවලියක් නොමැත]


“ඉහත” යන්නෙන් අදහස් කරන්නේ කුමක්ද? මෙම පිළිතුරේ විධාන රේඛා තුන හෝ පෙර පිළිතුරු? (කරුණාකර ඔබේ පිළිතුර සංස්කරණය කිරීමෙන් ප්‍රතිචාර දක්වන්න , මෙහි අදහස් දැක්වීම් වලින් නොවේ. කල්තියා ස්තූතියි.).
පීටර් මෝර්ටෙන්සන්

4

එහි විශාල විසඳුම් තිබේ, නමුත් අවසානයේ ඔබ නිවැරදි නාමාවලියෙහි නොමැති නම් සෑම ස්ක්‍රිප්ට් එකක්ම අසාර්ථක වනු ඇත. එබැවින් මේ වගේ කේත කරන්න:

if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here
    rm "$LINK_OR_DIR"
else
    # It's a directory!
    # Directory command goes here
    rmdir "$LINK_OR_DIR"
fi
fi

සාර්ථකව ක්‍රියාත්මක වන්නේ ඔබ ක්‍රියාත්මක වන මොහොතේ උප බහලුමක් ඇති නාමාවලියක නම් පමණි.

මම මේ වගේ ආරම්භක ප්‍රශ්නය තේරුම් ගත්තා: ගොනු පද්ධතියේ පරිශීලකයාගේ ස්ථානය නොසලකා නාමාවලියක් තිබේදැයි තහවුරු කර ගැනීම. එබැවින් 'find' විධානය භාවිතා කිරීමෙන් උපක්‍රමය කළ හැකිය:

dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d

ලිපිගොනු / නාමාවලි සෙවීමේදී ප්‍රයෝජනවත් අංගයක් වන ආදේශක කාඩ්පත් භාවිතා කිරීමට ඉඩ සලසන බැවින් මෙම විසඳුම හොඳයි. එකම ගැටළුව නම්, සෙවූ නාමාවලිය නොපවතින නම්, 'find' විධානය සම්මත නිමැවුමට කිසිවක් මුද්‍රණය නොකරනු ඇත (මගේ රසය සඳහා අලංකාර විසඳුමක් නොවේ) සහ කෙසේ වෙතත් ශුන්‍ය පිටවීමක් ඇත. සමහර විට යමෙකුට මේ පිළිබඳව දියුණු විය හැකිය.


13
මගේ වර්තමාන වැඩ කරන නාමාවලිය දෙස ආචාරශීලීව බැලීම හෝ මා ලබා දෙන නිරපේක්ෂ මාර්ගය භාවිතා කරනවාට වඩා ඩිරෙක්ටරියක් සොයා ගැනීම සඳහා වැඩසටහනක් මගේ මුළු දෘ hard තැටිය හරහා ගියහොත් මා කෝපයට පත් වනු ඇත. ඔබ යෝජනා කළ දෙය නම් කරන ලද මෙවලමක් සඳහා හොඳ විය හැකි locateනමුත් වෙන කිසිම දෙයකට සුදුසු නැත ...
sarnold
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.