Er der en one-liner, der giver mig mulighed for at oprette en mappe og flytte ind i den på samme tid?

Jeg gentager en masse:

 mkdir longtitleproject cd longtitleproject  

Er der en måde at gøre det på en linje uden at gentage katalognavnet? Jeg er på bash her.

Kommentarer

Svar

Dette er den ene linie, du har brug for. Ingen anden konfiguration nødvendig:

mkdir longtitleproject && cd $_ 

$_ variablen, i bash, er det sidste argument, der blev givet til den forrige kommando. I dette tilfælde er navnet på den mappe, du lige har oprettet. Som forklaret i 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. 

Brug cd $_ til at hente den sidste argu ment for den forrige kommando i stedet for cd !$ fordi cd !$ giver det sidste argument for forrige kommando i shellhistorikken :

cd ~/ mkdir folder && cd !$ 

du ender hjemme (eller ~ /)

cd ~/ mkdir newfolder && cd $_ 

du ender i ny mappe under hjemmet !! (eller ~ / ny mappe)

Kommentarer

  • Hvorfor i alverden er denne ikke det accepterede svar
  • @JSmyth Jeg er enig , dette er en one-liner, der bruger native shell-funktionalitet
  • Jeg tror, at OP forsøger at undgå at bruge de to kommandoer. Dette svar er (næsten) lige så gyldigt som at gøre mkdir foo && cd foo, hvilket ikke er ‘ t praktisk.
  • OPen er beder om en one-liner, der ikke ‘ t kræver at gentage biblioteksnavnet, og det er det
  • Ved opstemmerne er det ‘ er tydeligt, at mange mennesker finder dette svar nyttigt. Jeg ‘ Jeg angiver, hvorfor jeg ikke ‘ ikke valgte dette svar: Jeg ‘ er meget sandsynligvis forkert indtastet && cd $_ da tasterne er så langt væk fra hjemmet, så selvom det er teknisk korrekt, er det ‘ ikke ergonomisk. Jeg sætter pris på, at det ‘ ikke er miljøafhængigt, og det er ‘ nyttigt at vide. Tak!

Svar

Der er ingen indbygget kommando, men du kan nemt skrive en funktion, der kalder mkdir derefter cd:

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

Sæt denne kode i din ~/.bashrc -fil (eller ~/.kshrc til ksh-brugere eller ~/.zshrc til zsh-brugere). Den definerer en funktion kaldet mkcd. "$1" erstattes af argumentet for funktionen, når du kører den.

Denne enkle version har flere mangler:

  • Du kan ikke oprette en kæde af underkataloger på én gang. Fix: send indstillingen -p til mkdir. (Dette kan eller ikke være ønskeligt, da det øger risikoen for, at en tastefejl ikke bliver opdaget, f.eks. mkcd mydierctory/newsub vil med glæde skabe mydierctory og mydierctory/newsub når du mente at oprette newsub inde i eksisterende mydirectory.)
  • Hvis argumentet begynder med - men ikke “t bare -, så mkdir og cd fortolker det som en mulighed. Hvis det “bare er -, fortolker cd det til at betyde $OLDPWD. det “s + efterfulgt af 0 eller flere cifre, så fortolker cd i zsh det som et indeks i biblioteksstakken. Du kan løse det første problem, men ikke de to andre, ved at sende -- før argumentet. Du kan løse alle disse problemer ved at forudse ./ til argumentet, hvis det er en relativ sti.
  • mkdir følger ikke CDPATH, men cd gør det, så hvis du har indstillet CDPATH til en værdi, der ikke begynder med . (en ganske vist usædvanlig konfiguration), så kan cd bringe dig til en anden mappe end den der lige blev oprettet.Forudbestemmelse af ./ til relative stier løser dette¹ (det får CDPATH til at blive ignoreret).
  • Hvis mkdir mislykkes, det forsøger at udføre cd. Fix: Brug && til at adskille de to kommandoer.

Stadig ret simpelt:

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

Denne version har stadig potentialet til at få cd til at gå ind i en anden mappe end den at mkdir netop oprettet i en kant: hvis argumentet til mkcd indeholder .. og går gennem et symbolsk link. For eksempel, hvis den aktuelle mappe er /tmp/here og mylink er et symbolsk link til /somewhere/else , derefter skaber mkdir mylink/../foo /somewhere/else/foo mens cd mylink/../foo skifter til foo. Det er ikke nok at lede efter symbolske links i argumentet, fordi skallen også sporer symbolske links i sin egen aktuelle mappe, så cd /tmp/mylink; mkdir ../foo; cd ../foo skifter ikke til den nye mappe (/somewhere/else/foo) men ind i /tmp/foo. En løsning på dette er at lade cd indbygget løse alt .. stykomponenter først (det giver ikke mening at bruge foo/.. hvis foo ikke ” t eksisterer, så mkdir behøver aldrig at se nogen ..).

Vi kommer til denne robuste, hvis den er lidt blodig version:

 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 }  

(Øvelse: hvorfor bruger jeg en subshell til den første cd opkald?)

Hvis mkdir mislykkes, vil jeg være sikker på ikke at ændre den aktuelle bibliotek. At skifte tilbage med cd – eller $ OLDPWD er ikke god nok, hvis skallen ikke har det tilladelse til at skifte til den aktuelle mappe. Også at kalde cd-opdateringer OLDPWD, så vi vil kun gøre det en gang (eller gendanne OLDPWD).


Der er også mindre specialiserede måder for ikke at skulle indtaste ordet fra den forrige linje:

  • Skriv cd , derefter Esc . (eller Alt + . ) for at indsætte det sidste argument fra den forrige kommando.
  • cd !$ udfører cd på det sidste argument i den forrige kommando.
  • Tryk Op for at hente den forrige kommandolinje, og rediger den derefter at skifte mkdir til cd.

¹ pas dog på, at det virker ikke i ksh93, da u+ version , fast i 93u + m / 1.0.0-alpha + d1483150 2021-01-05

Kommentarer

  • Tak! Esc. virker det mest bekvemme for mig, gør nøglesekvensen har nogen speciel m spiser?
  • Det ‘ er bare Bash (og arvet fra ksh, og fungerer også i zsh) sekvens for ” Gentag sidste ord i forrige kommando “. Jeg bruger det ganske ofte.
  • @Gilles I ‘ Jeg begynder at tro, at ” Gilles ” konto deles faktisk af et ekspertpanel. 😉
  • @StephaneChazelas /a/b/..// ville faktisk fungere, men ikke /a/b/../c. Fast. Jeg ‘ har stillet spørgsmålet til et bredere publikum.
  • mkcd() { mkdir -p "$1" && cd "$1"; } virker ikke ‘ t synes at være et problem i (min forekomst af) 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 (inkluderer opsætningen og) viser /tmp/here/foo hvilket er det, der blev oprettet (og hvad jeg forventede). bash fejlagtigt opretter og ændrer fejlagtigt til /var/tmp/somewhere/foo.

Svar

Jeg ville aldrig have tænkt mig at opskrive denne adfærd, fordi jeg indtaster følgende næsten hver time …

$ mkdir someDirectory<ENTER> $ cd !$ 

hvor bash venligt erstatter !$ med det sidste ord i den sidste linje; dvs. det lange biblioteksnavn, som du indtastede.

Derudover er filnavnafslutning din ven i sådanne situationer. Hvis din nye mappe var den eneste fil i mappen, ville en hurtig dobbelt TAB give dig den nye mappe uden at genindtaste den.

Selvom det er sejt, at bash tillader dig for at opskrive så almindelige opgaver, som de andre svar antyder, synes jeg det er bedre at lære de kommandolinjedigeringsfunktioner, som bash har at tilbyde, så når du arbejder på en anden maskine, mangler du det syntaktiske sukker, som dine brugerdefinerede scripts giver.

Kommentarer

Svar

Hvis du bruger Åh min Zsh, der er en kommando kaldet tag der gør nøjagtigt dette. Det ville se sådan ud.

take myfolder 

Jeg fandt denne faktisk ved et uheld. Jeg kiggede bare, og den er anført på dette cheatsheat fra Oh My Zsh GitHub wiki. Det er en ganske nyttig kommando og tilsyneladende meget let at oprette dig selv.

Kommentarer

  • Jeg vidste aldrig om take 🙂 Perfekt! btw – iTerm2 med Oh My Zsh. Der er faktisk 3 perfekte svar her. Den ene, den af @jes ú s-carrera, og det valgte svar. Afhænger af din opsætning og præference.

Svar

I henhold til Hvilke tilpasninger har du foretaget på din shell-profil for at øge produktiviteten? , sådan gør jeg det:

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

det betyder, at det også fungerer, hvis biblioteket allerede findes.

Kommentarer

  • -p mulighed for at mkdir vil undertrykke fejl.
  • mcd er en allerede eksisterende kommando. Selvom du ‘ lige har givet et eksempel, brugte jeg det selv som det ‘ et bogstav kortere end mkcd.
  • @Dharmit Shah: Hvad er den eksisterende mcd kommando? Hvilken pakke eller projekt giver denne kommando?
  • mtools leverer mcd-kommandoen. Dens man-side siger ” Kommandoen mcd bruges til at ændre mtools-arbejdsmappe på MS-DOS-disken. ”

Svar

Eller du kan bare oprette en kort variabel on-the-fly og bruge den to gange x = longproject ; mkdir $x ; cd $x – som jeg indrømmer, stadig er længere end at bruge en shellscript-funktion 🙂

Svar

Dette er en enkel ting at gøre i et bash-script / -funktion. Jeg oprettede en meget læselig og tilstrækkeligt dokumenteret tutorial inklusive scripts, der fungerer på både Linux og MacOS (dette vil også blive opretholdt i fremtiden).

Mit mål for tutorials-kompleksiteten er: skrevet til et målrettet publikum med de eneste forudsætninger for at brugeren har en puls og kan læse engelsk, så giv feedback, hvis du har brug for hjælp.

https://github.com/craigopie/shellscripts

 mcdir() { if [ $# -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--help" ] then echo "Usage: [option...] {directory}" echo " -p, --path Create all directories in path " echo " -h, --help Shows this helpful information " echo return 0 fi ## create directory with a path if [ $1 = "-p" ] || [ $1 = "--path" ] then mkdir -p "$2" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$2" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 fi ## create directory in this location mkdir "$1" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$1" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 } export -f mcdir  

For at installere dette har du to muligheder:

  • Først skal du tilføje funktionen til din .bashrc -fil.
  • Den anden er at tilføje filen til din sti og kilde derefter filen i din .bash_profile -fil.

Igen er README-filen meget detaljeret om, hvordan du gør dette.

Held og lykke!

Svar

Her “er en lille variant, der er værd at nævne:

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

Føj dette til yo ur ~/.bash_profile, og du kan derefter bruge mkdir som normalt (når du først har source ” d it), bortset fra nu, kører den funktionen ovenfor i stedet for standard mkdir kommandoen.

Bemærk, dette validerer ikke input i henhold til den accepterede svar af Gilles , men viser, hvordan du (effektivt) kan tilsidesætte indbyggede.

Fra docs (omskrevet let):

command mkdir [args] kører mkdir med args ignorerer enhver shell-funktion ved navn mkdir. Kun shell-indbyggede kommandoer eller kommandoer, der findes ved at søge i PATH, udføres. Hvis der er en skalfunktion med navnet ls, kører command ls inden for funktionen, udfører den eksterne kommando ls i stedet for at kalde funktionen rekursivt

Jeg tror builtin opnår et lignende resultat til command.

Kommentarer

  • du bør helt sikkert citere $dir
  • @Jeff, aftalt, men det accepterede svar har al den validering, man har brug for.Jeg ‘ præsenterer netop brugen af command som et alternativ.

Svar

Tilføjelse af hjælpefunktion til BASH, ZSH eller KSH

Opret mkcd kommando til dit miljø i en linje

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

Svar

Hvis du bruger Oh-my-zsh , take kommando gør tricket. Se på snydearket .

Svar

Bare automatiserede ovenstående svar og lavede et engangseksekverbart script:

fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc 

Kopier det bare i en ny fil mkcd.sh og kør det kun en gang i terminalen ved bash mkcd.sh. Udfør derefter source ~/.bashrc for at få det til at fungere i den aktuelle session.

Herefter kan du bruge mkcd some_dir til at oprette og indtast direkte i den mappe.

Kommentarer

  • Du foreslår at du skriver et script (i en fil), hvis eneste formål er at føje til ~/.bashrc fil (med et svar, der allerede er givet)? Og hvordan foreslår du at oprette dette mkcd.sh script? Med en redaktør, måske? Dette ligner mere arbejde end bare redigering af ~/.bashrc. Hvilken fordel har dette i forhold til det accepterede svar? ………………………………………………………………………… P.S. Dette mislykkes på grund af citater af problemer, som fortæller mig, at du ikke engang har prøvet det selv.
  • Jeg er ked af at sige, men ja, da jeg skrev i mit svar, brugte jeg ovenstående svar. Det virker. Hvis du ikke ‘ ikke tror på mig, så prøv det. Og om ikke at prøve, brugte jeg hele dagen til at skrive sådanne scripts i bash og python i dag.
  • Jeg prøvede, hvad du skrev. Det fungerer ikke .

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *