ඩිරෙක්ටරියක් දැනටමත් නොමැති නම් පමණක් mkdir කරන්නේ කෙසේද


2000

මම AIX හි KornShell (ksh) යටතේ ධාවනය කිරීම සඳහා ෂෙල් පිටපතක් ලියමි. mkdirඩිරෙක්ටරියක් සෑදීමට විධානය භාවිතා කිරීමට මම කැමතියි . නමුත් නාමාවලිය දැනටමත් පැවතිය හැකිය, එවැනි අවස්ථාවක මට කිසිවක් කිරීමට අවශ්‍ය නැත. එබැවින් ඩිරෙක්ටරිය නොපවතිනදැයි පරීක්ෂා කිරීමට හෝ mkdirපවතින ඩිරෙක්ටරියක් සෑදීමට උත්සාහ කරන විට විසි කරන "ගොනුව පවතී" දෝෂය මැඩපවත්වා ගැනීමට මට අවශ්‍යය .

මට මෙය වඩාත් හොඳින් කළ හැක්කේ කෙසේද?

Answers:


3323

උත්සාහ කරන්න mkdir -p:

mkdir -p foo

මෙය නොපවතින ඕනෑම අතරමැදි නාමාවලි ද නිර්මාණය කරන බව සලකන්න; උදාහරණයක් වශයෙන්,

mkdir -p foo/bar/baz

නාමාවලි නිර්මාණය කරනු ඇත foo, foo/barසහ foo/bar/bazඔවුන් නොපවතියි නම්.

GNU වැනි සමහර ක්‍රියාත්මක mkdirකිරීම් mkdir --parentsවඩාත් කියවිය හැකි අන්වර්ථයක් ලෙස ඇතුළත් වේ , නමුත් මෙය POSIX / Single Unix Specification හි නිශ්චිතව දක්වා නොමැති අතර මැකෝස්, විවිධ BSD සහ විවිධ වාණිජ යුනික්ස් වැනි බොහෝ පොදු වේදිකාවල නොපවතී. එබැවින් එය වළක්වා ගත යුතුය.

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

[ -d foo ] || mkdir foo

11
ඔබ භාවිතා කළ කෙටි උදාහරණය හරියටම ඔබ නොකළ යුතු දෙයයි. එය කේතීකරණ ඉඩ ඉතිරි කර ගැනීම සඳහා තර්කනය ආපසු හරවන නමුත් එය භාවිතා කළ යුතුය! සහ && සහ එය කියවන අයට වඩාත් අර්ථවත් කරන්න.
මයික් Q

16
Nd ඇන්ඩ්‍රියාස්ලාර්සන් මෙම ප්‍රශ්නය mkdirවින්ඩෝස් මත නොව යුනික්ස් වැනි පද්ධති මත ය. -pPOSIX / Single Unix පිරිවිතර අනුකූලතාව සඳහා අවශ්‍ය වේ, එබැවින් එම පිරිවිතරයන්ට අනුකූල වීමට අදහස් කරන ඕනෑම දෙයක් සහාය වනු ඇත -p. ඔබ සිග්වින් හෝ එම්එස්වයිඑස් වැනි පොසික්ස් අනුකරණ ස්ථරයක් භාවිතා නොකරන්නේ නම් වින්ඩෝස් සම්පූර්ණයෙන්ම වෙනස් වේ.
බ්‍රයන් කැම්බල්

24
මම අද රසවත් දෙයක් සොයාගත්තා mkdir -p, ඔබට වරහන් භාවිතා කළ හැකිය! {}විධානයක් තුළ "සංකීර්ණ" නාමාවලි ගසක් සෑදීමට. මෙතැනින් බලන්න: technsophos.com/2010/04/15/…
herve

12
IkeMikeQ ||වෙනුවට මම කැමති &&වන්නේ මුළු පේළියටම නිවැරදි පිටවීමේ තත්වය ඇති බැවිනි. වැදගත් වන්නේ ඔබේ කවචය සමඟ errexitධාවනය වන්නේ නම් හෝ එම රේඛාව ශ්‍රිතයක අවසාන එක නම්, ස්විච්-කේස්, කුමක් වුවත්.
රුඩිමියර්

9
@ හර්ව් එයට කිසිම සම්බන්ධයක් නැත mkdir; කවචය එවැනි ප්‍රකාශනයක් විස්තාරණ තර්ක ලැයිස්තුවකට විස්තාරණය කරයි mkdir.
චෙප්නර්

179

මෙය ක්‍රියාත්මක විය යුතුය:

$ mkdir -p dir

හෝ:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

එය නොපවතී නම් නාමාවලිය නිර්මාණය කරනු ඇත, නමුත් ඔබ නිර්මාණය කිරීමට උත්සාහ කරන නාමාවලියෙහි නම දැනටමත් නාමාවලියක් හැර වෙනත් දෙයක් භාවිතා කරන්නේ නම් ඔබට අනතුරු අඟවයි.


කෝන් හි -d ක්‍රියාකරුවෙකු ඇතැයි මම නොසිතමි, ඒ වෙනුවට -e ගොනු / නාමාවලි දෙකටම භාවිතා වන අතර පැවැත්ම පරීක්ෂා කරයි. එසේම, ඔවුන් සියල්ලන්ම සාර්ථකත්වයට 0 ක් ආපසු එයි, එබැවින්! අතිරික්ත වේ. මම වැරදියි නම් මාව නිවැරදි කරන්න.
alkar

1
දෙයාකාරයෙන්ම වැරදියි, AFAIK. පරීක්ෂණ සාර්ථක වූ විට සත්‍ය වන අතර -d ද පවතී (අවම වශයෙන් මැකෝස් එක්ස් මත)
ඇල්නිටැක්

5
මෙය තරමක් නූල් ආරක්ෂිත නොවන බව සඳහන් කිරීම වටී. නාමාවලිය තිබේදැයි ඔබ පරීක්ෂා කරන කාලය සහ ඔබ ලිවීමට උත්සාහ කරන කාලය අතර, දේවල් වෙනස් විය හැකිය.
ජස්ටින් එල්.


75

එක් විධානයකින් සංකීර්ණ නාමාවලි ගස් අර්ථ දැක්වීම

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

පවතින විට කිසිදු දෝෂයක් නොමැත, අවශ්‍ය පරිදි මව් නාමාවලි සාදන්න
Fedir RYKHTIK

19
මෙය තමාගේම අංගයක් mkdirනොව, විධානය ක්‍රියාත්මක කරන කවචය බව මතක තබා ගන්න . එය බ්‍රේස් ප්‍රසාරණය ලෙස හැඳින්වේ - AFAIK, Bash, ksh, zsh සහ C shell පමණක් එයට සහාය දක්වයි.
ඩැනියෙල් කමිල් කොසාර්

3
ඔබට කොමාව වටා අවකාශ තිබේ නම් ඔබට අනපේක්ෂිත ප්‍රති .ල ලැබෙනු ඇත. පරෙස්සම් වන්න.
ඇට්ලස් 7

1
@ ඇට්ලස් 7 ප්‍රකාශ කර ඇති පරිදි, ඔබට සාමාන්‍යයෙන් රීජෙක්ස් හි කොටසක් වන අක්ෂර වලින් ගැලවීමට අවශ්‍ය වනු ඇත. (එනම් folder nameඔබ භාවිතා කිරීම වෙනුවට භාවිතා කළ යුතුය folder\ name)
ජෝන් හැමිල්ටන්

2
මෙය පිළිතුරක් නොවේ; මෙය වෙනම මාතෘකාවක් වන අතර එය අදහස් දැක්වීමක් ලෙස වඩාත් යෝග්‍ය වේ.
ක්‍රිස් පේජ්

42

ඔබට කිසිදු දෝෂ පණිවිඩයක් පෙන්වීමට අවශ්‍ය නැතිනම්:

[ -d newdir ] || mkdir newdir

ඔබට ඔබේම වැරදි පණිවිඩයක් පෙන්වීමට අවශ්‍ය නම්:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir


Et පීටර් මෝර්ටෙන්සන්: ඇත්ත වශයෙන්ම. mkdir -pඔබට ධාවන කොන්දේසි අවශ්‍ය නැතිනම් භාවිතා කරන්න . නමුත් ඔබට ඔබේම Directory existsදෝෂයක් පෙන්වීමට නොහැකි වනු ඇත .
ජාහිඩ්

20

පැරණි උත්සාහ කර ඇත්ත

mkdir /tmp/qq >/dev/null 2>&1

වෙනත් විසඳුම් බොහොමයක් ඇති තරඟ කොන්දේසි වලින් තොරව ඔබට අවශ්‍ය දේ කරනු ඇත.

සමහර විට සරලම (හා කැත) විසඳුම් හොඳම වේ.


6
"Tmp" නොතිබුනේ නම් මෙය අසාර්ථක වනු ඇත. එය ඔබට කිසිදු තහවුරු කිරීමක් ලබා නොදේ.
මයික් Q

තරඟ කොන්දේසි? ඔබේ පිළිතුර විස්තාරණය කළ හැකිද? පරමාණුක නොවන පරීක්ෂණ සහ නිර්මාණය?
පීටර් මෝර්ටෙන්සන්

[ -d newdir ] || mkdir newdirඩිරෙක්ටරිය මුලින් නොපවතින (උදාහරණයක් ලෙස) පීටර් වැනි ස්නිපටයක් තුළ ධාවන තත්වයක් ඇත, එහි පැවැත්ම සඳහා වන පරීක්ෂණය සහ නිර්මාණය කිරීමට උත්සාහ කිරීම අතර තවත් ක්‍රියාවලියක් තුළට ගොස් නාමාවලිය නිර්මාණය කළ හැකිය. එබැවින් mkdirඑය අසාර්ථක වනු ඇත.
paxdiablo

15

mkdir fooනාමාවලිය පැවතුනද ක්‍රියා කරයි. එය ක්‍රියාත්මක කිරීම සඳහා "foo" නම් නාමාවලිය නොපවතී නම්, -pධජය භාවිතා කිරීමට උත්සාහ කරන්න .

උදාහරණයක්:

mkdir -p foo

මෙය "foo" නම් නාමාවලිය නිර්මාණය කරන්නේ එය නොපවතින විට පමණි. :)


2
Rian බ්‍රයන් කැම්ප්බෙල් සඳහන් කළ පරිදි, මෙය මාර්ගයේ වෙනත් ඕනෑම නාමාවලි නිර්මාණය කරනු ඇත. උදා: පරිමාවක් ගණනය නොකළහොත් මෙය භයානක විය හැකිය, මන්ද එය සවිකිරීමේ ස්ථානයේ නාමාවලි නිර්මාණය කළ හැකිය.
uliwitness


10

mkdir වින්ඩෝස් 8+ පද්ධති මත -p ස්විචයට තවදුරටත් සහාය නොදක්වයි.

ඔබට මෙය භාවිතා කළ හැකිය:

IF NOT EXIST dir_name MKDIR dir_name

11
OP යනු AIX kornshell ගැන ... වින්ඩෝස් සමඟ කිසිම සම්බන්ධයක් නැහැ නේද?
ජේ. චොමෙල්

මීට පෙර එයට සහාය දුන් බව ඔබට විශ්වාසද? ඔබට ප්‍රභවයක් තිබේද?
පීටර් මෝර්ටෙන්සන්

10

නැතහොත් ඔබට මුලින් පැවැත්ම පරීක්ෂා කිරීමට අවශ්‍ය නම්:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e යනු කෝර්න්ෂෙල් සඳහා පවතින පරීක්ෂණයයි .

ඔබට කෝර්න්ෂෙල් අත්පොතක් ගොග්ලිං කිරීමට උත්සාහ කළ හැකිය.


9

man mkdirවිකල්පය සඳහා man පිටුව වෙත යොමු කිරීම -p

   -p, --parents
          no error if existing, make parent directories as needed

එය ලබා දී ඇති මාර්ගයක සියලුම නාමාවලි නිර්මාණය කරනු ඇත, පවතින්නේ නම් කිසිදු දෝෂයක් නොපවතින අතර එය ලබා දී ඇති මාර්ගයේ වමේ සිට දකුණට සියලු නාමාවලි නිර්මාණය කරයි. පහත විධානය උත්සාහ කරන්න. මෙම විධානය නිකුත් කිරීමට පෙර නාමාවලි newdirසහ anotherdirනොපවතී

නිවැරදි භාවිතය

mkdir -p /tmp/newdir/anotherdir

මෙම විධානය ක්රියාත්මක කරන පසු ඔබට බලන්න පුළුවන් newdirසහ anotherdirයටතේ / tmp නිර්මාණය. ඔබට මෙම විධානය ඔබට අවශ්‍ය වාර ගණනක් නිකුත් කළ හැකිය, විධානය සැමවිටම ඇත exit(0). මෙම හේතුව නිසා බොහෝ අය මෙම විධානය ෂෙල් ස්ක්‍රිප්ට් වල භාවිතා කරන්නේ එම සත්‍ය මාර්ග භාවිතා කිරීමට පෙරය.


8

ifනාමාවලිය තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට ඔබට ප්‍රකාශයක් භාවිතා කළ හැකිය . එය පිටවන්නේ නැත්නම්, නාමාවලිය සාදන්න.

  1. dir = / home / dir_name

    if [ ! -d $dir ]
    then
         mkdir $dir
    else
         echo "Directory exists"
    fi
  2. ඩිරෙක්ටරියක් සෑදීමට ඔබට mpdir සමඟ -p විකල්පය භාවිතා කළ හැකිය. නාමාවලිය නොමැතිදැයි එය පරීක්ෂා කරනු ඇත.

    mkdir -p $dir

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

    mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

If loop භාවිතා කිරීමෙන් යම් වාසියක් තිබේද!? කවුරුහරි එම අධි-විකල්පය තෝරා ගන්නේ ඇයි?
pedram bashiri

1
ෆෝල්ඩරයක් නොමැති විට ෆෝල්ඩර සෑදීමේ ක්‍රම මම ඔබට බෙදා ගතිමි. එය එක් අවශ්‍යතාවයක් මත රඳා පවතී. ඔබට භාවිත නඩුවක් තිබේ නම්, ඔබට ෆෝල්ඩරය නොපවතිනවාද යන්න පරීක්ෂා කර බැලීමට අවශ්‍ය නම් ඔබට විසඳුම 1 සමඟ යා හැකිය. එය වැදගත් නොවේ නම්, ඔබට විසඳුම 2 සමඟ යා හැකිය, එය ෆෝල්ඩරය නිර්මාණය කරයි නොපවතී නම්.
අභිනව වෛද්‍ය 8

මම ලූපයක් දුටුවේ නැත.
අමිත් නායිදු

4

මෙය සරල ශ්‍රිතයකි (Bash shell) එය නාමාවලියක් නොමැති නම් එය නිර්මාණය කිරීමට ඉඩ දෙයි.

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

ඉහත ශ්‍රිතය ඔබට පහත පරිදි හැඳින්විය හැකිය:

createDirectory / tmp / fooDir / BarDir

ඉහත දැක්වෙන්නේ fooDir සහ BarDir නොපවතින නම්. පුනරාවර්තන ලෙස නාමාවලි නිර්මාණය කරන mkdir විධානයෙහි "-p" විකල්පය සැලකිල්ලට ගන්න.


2
mkdir -p sam
  • mkdir = නාමාවලිය සාදන්න
  • -p = - දෙමාපියන්
  • (පවතින නම් කිසිදු දෝෂයක් නොමැත, අවශ්‍ය පරිදි මව් නාමාවලි සාදන්න)

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.