ඩිරෙක්ටරියක් නිර්මාණය කර එකවර ඒ තුළට යාමට මට ඉඩ සලසන එක් ලයිනර් තිබේද?


168

මම බොහෝ දේ පුනරුච්චාරණය කරමි.

mkdir longtitleproject
cd longtitleproject

නාමාවලි නාමය පුනරාවර්තනය නොකර එක් පේළියකින් එය කිරීමට ක්‍රමයක් තිබේද? මම මෙතන ඉන්නේ




1
mkdir longtitleprojectඉන්පසුcd !^
පරිශීලක 262826

Answers:


173

කිසිදු බිල්ට් විධාන තියෙනවා, නමුත් ඔබට ඉතා පහසුවෙන් හඳුන්වා තිබෙන්නේ ඒ උත්සවයකට ලියන්න පුළුවන් mkdirනම් cd:

mkcd () {
  mkdir "$1"
  cd "$1"
}

මෙම කේතය ඔබගේ ~/.bashrcගොනුවේ දමන්න (හෝ ~/.kshrcksh භාවිතා කරන්නන් ~/.zshrcසඳහා හෝ zsh භාවිතා කරන්නන් සඳහා). එය ශ්‍රිතයක් අර්ථ දක්වයි mkcd. "$1"ඔබ එය ක්‍රියාත්මක කරන විට ශ්‍රිතය පරාමිතිය මගින් ප්‍රතිස්ථාපනය වේ.

මෙම සරල අනුවාදයේ අඩුපාඩු කිහිපයක් තිබේ:

  • ඔබට එකවර උප බහලුම් දාමයක් සෑදිය නොහැක. නිවැරදි කරන්න: -pවිකල්පය වෙත යන්න mkdir. (මෙය හඳුනාගත නොහැකි යතුරු ලියනයක අවදානම වැඩි කරන බැවින් මෙය යෝග්‍ය විය හැකිය හෝ නොවිය හැකිය, උදා: mkcd mydierctory/newsubසතුටින් නිර්මාණය වනු ඇති mydierctoryඅතර mydierctory/newsubඔබ newsubපවතින ඇතුළත නිර්මාණය කිරීමට අදහස් කරන විට mydirectory.)
  • එම තර්කය සමඟ ආරම්භ නම් -නමුත් පමණක් ම නො වේ -, එසේ නම් mkdirහා cdඑය විකල්පයක් ලෙස අර්ථ නිරූපණය වනු ඇත. එය හුදෙක් එය නම් -, එසේ නම් cdඅර්ථය ගෙන දෙන පරිදි අර්ථ නිරූපණය වනු ඇත $OLDPWD. එය +ඉලක්කම් 0 ක් හෝ වැඩි ගණනක් අනුගමනය කරන්නේ නම් cd, zsh හි එය නාමාවලි තොගයේ දර්ශකයක් ලෙස අර්ථ නිරූපණය කරයි. ඔබට පළමු ගැටළුව විසඳා ගත හැකිය, නමුත් අනෙක් දෙක නොවේ, --තර්කයට පෙර සම්මත වීමෙන් . ./සාපේක්ෂ මාර්ගයක් නම් තර්කයට සූදානම් වීමෙන් ඔබට මෙම සියලු ගැටලු විසඳා ගත හැකිය .
  • mkdirඅනුගමනය නොකෙරේ CDPATH, නමුත් cdඑසේ නොවේ, එබැවින් ඔබ CDPATHආරම්භ නොවන අගයකට .(තරමක් අසාමාන්‍ය වින්‍යාසයක් ඇති බව පිළිගෙන තිබේ නම්), cdඔබ විසින් නිර්මාණය කරන ලද නාමාවලියට වඩා වෙනස් නාමාවලියකට ඔබව ගෙන එනු ඇත. ./සාපේක්ෂ මාර්ග වලට පෙර සූදානම මෙය නිවැරදි කරයි (එය CDPATHනොසලකා හැරීමට හේතු වේ).
  • නම් mkdirඅසමත්, එය ක්රියාත්මක කිරීමට උත්සාහ cd. Fix: &&විධාන දෙක වෙන් කිරීමට භාවිතා කරන්න.

තවමත් තරමක් සරලයි:

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

මෙම අනුවාදයට තවමත් එක් දාරයක නිර්මාණය කළ cdඩිරෙක්ටරියට වෙනස් ඩිරෙක්ටරියක් තුළට යාමට හැකියාවක් ඇත mkdir: තර්කය mkcdඅඩංගු වන ..අතර සංකේතාත්මක සබැඳියක් හරහා යන්නේ නම්. උදාහරණයක් ලෙස, නම් වත්මන් නාමාවලිය /tmp/hereහා mylinkකිරීම සඳහා සංකේතමය සම්බන්ධයක් /somewhere/elseනම් mkdir mylink/../fooනිර්මාණය /somewhere/else/fooබැවින්ද cd mylink/../fooබවට වෙනස් foo. තර්කය තුළ සංකේතාත්මක සබැඳි සෙවීම පමණක් ප්‍රමාණවත් නොවේ, මන්ද යත් කවචය එහි වත්මන් නාමාවලියෙහි සංකේතාත්මක සබැඳි ලුහුබඳින බැවිනි, එබැවින් cd /tmp/mylink; mkdir ../foo; cd ../fooනව ඩිරෙක්ටරියට ( /somewhere/else/foo) නොව වෙනස් වේ /tmp/foo. මේ සඳහා cdවිසඳුමක් නම්, සියලු ..මාර්ග සංරචක මුලින්ම විසඳීමට බිල්ඩින්ට ඉඩ දීමයි ( foo/..එසේ නම් එය භාවිතා කිරීම තේරුමක් නැතfooනොපවතින බැවින් mkdirකිසි විටෙක කිසිවක් දැකීමට අවශ්‍ය නොවේ ..).

තරමක් රුදුරු අනුවාදයක් නම් අපි මෙම ශක්තිමත් වෙත පැමිණෙමු:

mkcd () {
  case "$1" in
    */..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
    /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

(ව්‍යායාම: පළමු cdඇමතුම සඳහා මා උපසිරැසියක් භාවිතා කරන්නේ ඇයි ?)

Mkdir අසමත් වුවහොත්, වත්මන් නාමාවලිය වෙනස් නොකිරීමට මට අවශ්‍යය. සෙල් - හෝ LD OLDPWD සමඟ නැවත වෙනස් කිරීම ෂෙල් එකට එහි වත්මන් නාමාවලියට වෙනස් කිරීමට අවසර නොමැති නම් ප්‍රමාණවත් නොවේ. එසේම, සීඩී යාවත්කාලීන කිරීම් OLDPWD ලෙස හැඳින්වීම, එබැවින් අපට එය කිරීමට අවශ්‍ය වන්නේ එක් වරක් පමණි (හෝ OLDPWD ප්‍රතිස්ථාපනය කරන්න).


පෙර පේළියේ සිට වචනය නැවත ටයිප් නොකිරීමට අඩු විශේෂිත ක්‍රම ද ඇත:

  • වර්ගය cd නම්, Esc .(හෝ Alt+ .) පසුගිය විධානය පසුගිය තර්කය ඇතුල් කිරීමට.
  • cd !$cdපෙර විධානයේ අවසාන තර්කය මත ක්‍රියාත්මක කරයි .
  • මාධ්ය Up, පසුව පෙර විධාන රේඛාව සිහිපත් කිරීමට වෙනස් කිරීමට එය සංස්කරණය mkdirබවට cd.

ස්තූතියි! එස්. මට වඩාත්ම පහසු බව පෙනේ, යතුරු අනුක්‍රමයට විශේෂ අර්ථයක් තිබේද?
methodofaction

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

33
Il ගිලස් මම සිතන්නට පටන් ගෙන ඇත්තේ “ගිලෙස්” ගිණුම ඇත්ත වශයෙන්ම විශේෂ. මණ්ඩලයක් විසින් බෙදාගෙන ඇති බවයි. ;-)
කීත්

St ස්ටෙෆාන් චැසෙලාස් /a/b/..//ඇත්ත වශයෙන්ම ක්‍රියා කරයි නමුත් එසේ නොවේ /a/b/../c. ස්ථාවර. මම ප්‍රශ්නය පුළුල් ප්‍රේක්ෂක පිරිසකට යොමු කර ඇත්තෙමි.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

1
mkcd() { mkdir -p "$1" && cd "$1"; }(මගේ උදාහරණය) zsh හි ගැටලුවක් ලෙස නොපෙනේ. mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd(සැකසුම ඇතුළත් වේ) සහ /tmp/here/fooනිර්මාණය කරන ලද සංදර්ශන (සහ මා බලාපොරොත්තු වූ දේ). bashවැරදි ලෙස නිර්මාණය කර වෙනස් කරයි /var/tmp/somewhere/foo.
ඇඩම් කැට්ස්

151

ඔබට අවශ්‍ය එක් ලයිනර් මෙයයි. වෙනත් වින්‍යාසයක් අවශ්‍ය නොවේ:

mkdir longtitleproject && cd $_

මෙම $_විචල්ය, bash දී, පෙර භාවිතා කිරීමට ලබා දුන් අවසන් තර්කයකි. මෙම අවස්ථාවේදී, ඔබ දැන් නිර්මාණය කළ නාමාවලියෙහි නම. විස්තර කර ඇති පරිදි man bash:

_         At  shell  startup,  set to the absolute pathname used to invoke
          the shell or shell script being executed as passed in the  envi
          ronment  or  argument  list.   Subsequently, expands to the last
          argument to the previous command, after expansion.  Also set  to
          the  full  pathname  used  to  invoke  each command executed and
          placed in the environment exported to that command.  When check
          ing  mail,  this  parameter holds the name of the mail file cur
          rently being checked."$_" is the last argument of the previous command.

ෂෙල් ඉතිහාසයේ පෙර විධානයේ අවසාන තර්කය ලබා දෙන නිසා cd $_වෙනුවට පෙර විධානයේ අවසාන තර්කය ලබා ගැනීමට භාවිතා කරන්න :cd !$cd !$

cd ~/
mkdir folder && cd !$

ඔබ ගෙදර යයි (හෝ ~ /)

cd ~/
mkdir newfolder && cd $_

ඔබ අවසන් වන්නේ නිවස යටතේ නව ෆෝල්ඩරයක !! (හෝ ~ / නව ෆෝල්ඩරය)


26
පෘථිවියේ මෙය පිළිගත් පිළිතුර නොවන්නේ ඇයි
JSmyth

1
@ ජේ ස්මිත් මම එකඟ වෙමි, මෙය ස්වදේශික ෂෙල් ක්‍රියාකාරිත්වය භාවිතා කරන එක් ලයිනර් ය
sming

1
මම හිතන්නේ OP විධාන දෙක භාවිතා කිරීමෙන් වැළකී සිටීමට උත්සාහ කරයි. මෙම පිළිතුර (පාහේ) වලංගු mkdir foo && cd fooවන අතර එය පහසු නැත.
josemigallas

8
නාමාවලි නාමය පුනරාවර්තනය කිරීමට අවශ්‍ය නොවන එක් ලයිනර් එකක් OP ඉල්ලා සිටින අතර, එය එයයි
ජෙසී කැරෙරා

1
බොහෝ අය මෙම පිළිතුර ප්‍රයෝජනවත් බව සොයාගෙන ඇත. මම මෙම පිළිතුර තෝරා නොගත්තේ මන්දැයි මම සඳහන් කරමි: && cd $_යතුරු නිවසේ පේළියෙන් බොහෝ away තින් ඇති බැවින් මම වැරදියට ටයිප් කිරීමට බොහෝ දුරට ඉඩ ඇත , එබැවින් තාක්‍ෂණිකව නිවැරදි වුවත් එය ergonomic නොවේ. එය පරිසරය මත රඳා නොපවතින බවත් දැන ගැනීම ප්‍රයෝජනවත් බවත් මම අගය කරමි. ස්තූතියි!
methodofaction

30

මෙම හැසිරීම ලිවීම මට කිසි විටෙකත් සිදු නොවනු ඇත, මන්ද මම පහත සඳහන් කරුණු පැයකට ආසන්න කාලයක් ඇතුළත් කරමි ...

$ mkdir someDirectory<ENTER>
$ cd !$

එහිදී බාෂ් කාරුණිකව !$අන්තිම පේළියේ අවසාන වචනය සමඟ ආදේශ කරයි; එනම් ඔබ ඇතුළත් කළ දිගු නාමාවලි නාමය.

මීට අමතරව, එවැනි අවස්ථාවන්හිදී ගොනු නාමය සම්පූර්ණ කිරීම ඔබේ මිතුරා වේ. ඔබගේ නව නාමාවලිය ෆෝල්ඩරයේ ඇති එකම ගොනුව නම් ඉක්මන් දෙගුණයක් TABමඟින් නව නාමාවලිය නැවත ඇතුළත් නොකර ඔබට ලබා දෙනු ඇත.

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


1
මේ වගේ වැදගත්ම බැෂ් ක්වාර්ක් ගැන දැනගන්න හොඳ තැනක් තියෙනවද?
domicbri7

@ dominicbri7 සාමාන්යයෙන් එම හෆීස් එම ඉහළ ප්රතිඵලයක් ලෙස පහත සඳහන් දෙන "සංස්කරණය bash විධාන රේඛාව" යටතේ එන web.mit.edu/gnu/doc/html/features_7.html එසේම,! $ දකින වචනය Designator සඳහා උදාහරණයක් GNU. org / software / bash / manual / bashref.html # Word-Designators
Rob

17

අනුව අභිරුචිකරණය ඔබ ඵලදායීතාව ඉහළ නැංවීම සඳහා ඔබගේ ෂෙල් පැතිකඩ මත සිදු කර ඇත කුමක්ද? , මම මෙය කරන්නේ මෙයයි:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

එයින් අදහස් වන්නේ ඩිරෙක්ටරිය දැනටමත් තිබේ නම් එය ද ක්‍රියාත්මක වන බවයි.


4
-pMkdir සඳහා ඇති විකල්පය දෝෂ මැඩපවත්වනු ඇත.
ග්ලෙන් ජැක්මන්

1
mcd යනු දැනටමත් පවතින විධානයකි. ඔබ දැන් උදාහරණයක් දී ඇතත්, එය mkcd ට වඩා කෙටි අකුරක් බැවින් මම එය භාවිතා කළෙමි.
ධර්මිට්

Har ධර්මිත් ෂා: පවතින mcdවිධානය කුමක්ද? මෙම විධානය සපයන පැකේජය හෝ ව්‍යාපෘතිය කුමක්ද?
මයිකල්

2
mtools mcd විධානය සපයයි. එහි man පිටුව පවසන්නේ "MS-DOS තැටියේ mtools වැඩ කරන නාමාවලිය වෙනස් කිරීමට mcd විධානය භාවිතා කරන බවයි."
ධර්මිට්

16

ඔබ Oh My Zsh භාවිතා කරන්නේ නම්, take නම් විධානයක් ඇත , එය හරියටම මෙය කරයි. එය මේ වගේ දෙයක් වනු ඇත.

take myfolder

මම මෙය අහම්බෙන් සොයා ගත්තා. මම බලා එය ලැයිස්තුගත කරනවා මෙම cheatsheat මෙම අපොයි මගේ Zsh GitHub විකියෙන්. එය බෙහෙවින් ප්‍රයෝජනවත් විධානයක් වන අතර පෙනෙන පරිදි ඔබම නිර්මාණය කිරීම ඉතා පහසුය.


1
මම කවදාවත් දැනගෙන හිටියේ නැහැ take:) පරිපූර්ණයි! btw - iTerm2 සමඟ Oh My Zsh. ඇත්ත වශයෙන්ම මෙහි පරිපූර්ණ පිළිතුරු 3 ක් ඇත. මෙය, ජෙසෙස්-කැරෙරා විසින්, සහ තෝරාගත් පිළිතුර. ඔබගේ සැකසුම සහ මනාපය මත රඳා පවතී.
වේඩ්

3

නැතහොත් ඔබට පියාසර කරන විට කෙටි විචල්‍යයක් නිර්මාණය කර එය දෙවරක් භාවිතා කළ හැකිය x = longproject ; mkdir $x ; cd $x- එය ෂෙල්ස්ක්‍රිප්ට් ශ්‍රිතයක් භාවිතා කිරීමට වඩා දිගු බව මම පිළිගනිමි :)


0

මෙහි සඳහන් කළ යුතු සුළු ප්‍රභේදයක් මෙන්න:

function mkdir() {
    local dir=$1
    command mkdir "$dir"  &&  cd "$dir"
}

මෙය ඔබගේ වෙත එක් කරන්න, ~/.bash_profileඑවිට ඔබට mkdirසාමාන්‍ය පරිදි භාවිතා කළ හැකිය (ඔබ sourceඑය කළ පසු), දැන් හැර එය සම්මත mkdirවිධානයට වඩා ඉහත ශ්‍රිතය ක්‍රියාත්මක කරයි .

සටහන, මෙය ගිලෙස් විසින් පිළිගත් පිළිතුරට අනුව ආදානය වලංගු නොවන නමුත් ඔබට බිල්ඩින් අභිබවා යා හැකි ආකාරය (effectively ලදායී ලෙස) පෙන්නුම් කරයි.

ලියකියවිලි වලින් (තරමක් අක්ෂර වින්‍යාසය):

command mkdir [args]දිවෙන mkdirසමඟ argsනම් ඕනෑම ෂෙල් කාර්යය නොසලකා හරිමින් mkdir. PATH සෙවීමෙන් සොයාගත් ෂෙල් බිල්ඩින් විධාන හෝ විධාන පමණක් ක්‍රියාත්මක වේ. නම් කරන ලද ෂෙල් ශ්‍රිතයක් තිබේ නම් ls, command lsශ්‍රිතය තුළ ක්‍රියාත්මක වීම මඟින් lsශ්‍රිතය පුනරාවර්තනය ලෙස හැඳින්වීම වෙනුවට බාහිර විධානය ක්‍රියාත්මක කරනු ඇත

builtinහා සමාන ප්‍රති result ලයක් ලැබෙනු ඇතැයි මම විශ්වාස කරමි command.


ඔබ අනිවාර්යයෙන්ම උපුටා දැක්විය යුතුයි $dir
ජෙෆ් ෂලර්

E ජෙෆ් එකඟ විය, නමුත් පිළිගත් පිළිතුරට අවශ්‍ය සියලුම වලංගු කිරීම් තිබේ. මම commandවිකල්පයක් ලෙස භාවිතා කිරීම ඉදිරිපත් කරමි .
අර්ජ්

0

BASH, ZSH හෝ KSH වෙත සහායක ක්‍රියාකාරිත්වය එක් කිරීම

mkcdඔබේ පරිසරයට එක් පේළියකින් විධානයක් සාදන්න

echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc


-1

ඉහත පිළිතුරු ස්වයංක්‍රීය කර එක් වරක් ක්‍රියාත්මක කළ හැකි පිටපතක් සාදන්න:

fun='
mkcd ()
{
    mkdir -p -- "$1" && cd -P -- "$1"
}'

echo "$fun" >> ~/.bashrc

මෙය නව ගොනුවක පිටපත් කර පර්යන්තයෙන් එක් වරක් පමණක්mkcd.sh ක්‍රියාත්මක කරන්න . ඉන්පසු ක්‍රියාත්මක කරන්නbash mkcd.shsource ~/.bashrcවත්මන් සැසිය තුළ එය පරිදි කරන්න.

මෙයින් පසු, ඔබට mkcd some_dirඑම ඩිරෙක්ටරියට සෘජුවම ඇතුලත් කිරීමට සහ ඇතුළත් කිරීමට භාවිතා කළ හැකිය .


1
(ගොනුවක) පිටපතක් ලිවීමට ඔබ යෝජනා කරන්නේ කාගේ එකම අරමුණ වන්නේ ~/.bashrcගොනුවට එකතු කිරීමද (දැනටමත් ලබා දී ඇති පිළිතුරක් සමඟ)? මෙම mkcd.shපිටපත නිර්මාණය කිරීමට ඔබ යෝජනා කරන්නේ කෙසේද? සංස්කාරකයෙකු සමඟ, සමහර විට? මෙය සංස්කරණයට වඩා වැඩක් සේ පෙනේ ~/.bashrc. පිළිගත් පිළිතුරට වඩා මෙයින් ඇති වාසිය කුමක්ද? පීඑස් ප්‍රශ්න උපුටා දැක්වීම නිසා මෙය අසාර්ථක වනු ඇත.
ස්කොට්

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

මම ඔබ ලියූ දේ අත්හදා බැලුවෙමි. එය ක්රියා නොකරයි .
ස්කොට්
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.