Er det en one-liner som lar meg lage en katalog og flytte inn på den samtidig?

Jeg gjentar meg mye av:

 mkdir longtitleproject cd longtitleproject  

Er det en måte å gjøre det på en linje uten å gjenta katalognavnet? Jeg er her.

Kommentarer

Svar

Dette er one-liner du trenger. Ingen annen konfigurasjon nødvendig:

mkdir longtitleproject && cd $_ 

$_ variabelen, i bash, er det siste argumentet som ble gitt til forrige kommando. I dette tilfellet er navnet på katalogen du nettopp opprettet. Som forklart 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. 

Bruk cd $_ for å hente det siste argumentet ment for forrige kommando i stedet for cd !$ fordi cd !$ gir det siste argumentet for forrige kommando i skallhistorikken :

cd ~/ mkdir folder && cd !$ 

du ender hjemme (eller ~ /)

cd ~/ mkdir newfolder && cd $_ 

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

Kommentarer

  • Hvorfor i all verden er dette ikke det aksepterte svaret
  • @JSmyth Jeg er enig , dette er en one-liner som bruker native shell-funksjonalitet
  • Jeg tror OP prøver å unngå å bruke de to kommandoene. Dette svaret er (nesten) like gyldig som å gjøre mkdir foo && cd foo, som ikke er ‘ t hendig.
  • OP er ber om en en-linje som ikke ‘ ikke krever å gjenta katalognavnet, og dette er det
  • Ved oppstemningene er det ‘ er tydelig at mange mennesker finner dette svaret nyttig. Jeg ‘ Jeg oppgir hvorfor jeg ikke ‘ ikke valgte dette svaret: Jeg ‘ jeg er veldig sannsynligvis feil && cd $_ siden tastene er så langt borte fra hjemmet, så selv om det er teknisk riktig, er det ‘ ikke ergonomisk. Jeg setter pris på det ‘ er ikke miljøavhengig, og det er ‘ nyttig å vite. Takk!

Svar

Det er ingen innebygd kommando, men du kan enkelt skrive en funksjon som kaller mkdir deretter cd:

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

Sett denne koden i ~/.bashrc -filen din (eller ~/.kshrc for ksh-brukere, eller ~/.zshrc for zsh-brukere). Den definerer en funksjon kalt mkcd. "$1" vil bli erstattet av argumentet til funksjonen når du kjører den.

Denne enkle versjonen har flere mangler:

  • Du kan ikke opprette en kjede av underkataloger på en gang. Fiks: Gi alternativet -p til mkdir. (Dette kan være ønskelig, eller ikke, da det øker risikoen for at en skrivefeil ikke blir oppdaget, f.eks. mkcd mydierctory/newsub vil gjerne skape mydierctory og mydierctory/newsub når du mente å lage newsub inne i eksisterende mydirectory.)
  • Hvis argumentet begynner med - men ikke «t bare -, så vil mkdir og cd tolke det som et alternativ. Hvis det bare er -, vil cd tolke det slik at det betyr $OLDPWD. det «s + etterfulgt av 0 eller flere sifre, vil cd i zsh tolke det som en indeks i katalogstakken. Du kan fikse det første problemet, men ikke de to andre, ved å sende -- før argumentet. Du kan løse alle disse problemene ved å forhåndsstille ./ til argumentet hvis det er en relativ bane.
  • mkdir følger ikke CDPATH, men cd gjør det, så hvis du har satt CDPATH til en verdi som ikke begynner med . (en riktignok noe uvanlig konfigurasjon), så kan cd føre deg til en annen katalog enn den som nettopp ble opprettet.Forhåndsbetaling av ./ til relative stier løser dette¹ (det fører til at CDPATH ignoreres).
  • Hvis mkdir mislykkes, den prøver å utføre cd. Fix: bruk && for å skille de to kommandoene.

Fortsatt ganske enkelt:

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

Denne versjonen har fremdeles potensial til å få cd til å gå inn i en annen katalog enn den at mkdir nettopp er opprettet i ett kantstilfelle: hvis argumentet til mkcd inneholder .. og går gjennom en symbolsk lenke. For eksempel hvis den nåværende katalogen er /tmp/here og mylink er en symbolsk lenke til /somewhere/else , deretter skaper mkdir mylink/../foo /somewhere/else/foo mens cd mylink/../foo endres til foo. Det er ikke nok å lete etter symbolske lenker i argumentet, fordi skallet også sporer symbolske lenker i sin egen nåværende katalog, så cd /tmp/mylink; mkdir ../foo; cd ../foo endres ikke til den nye katalogen (/somewhere/else/foo) men inn i /tmp/foo. En løsning på dette er å la cd innebygd løse alt .. banekomponenter først (det er ikke fornuftig å bruke foo/.. hvis foo ikke » t eksisterer, så mkdir trenger aldri å se noen ..).

Vi kommer til dette robuste hvis det er litt blodig versjon:

 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 bruker jeg en subshell for første cd samtale?)

Hvis mkdir mislykkes, vil jeg være sikker på at du ikke endrer den nåværende katalogen. Å bytte tilbake med cd – eller $ OLDPWD er ikke bra nok hvis skallet ikke har det tillatelse til å endre til sin nåværende katalog. Å ringe til cd-oppdateringer OLDPWD, så vi vil bare gjøre det en gang (eller gjenopprette OLDPWD).


Det er også mindre spesialiserte måter å slippe å skrive inn ordet fra forrige linje:

  • Skriv cd , deretter Esc . (eller Alt + . ) for å sette inn det siste argumentet fra forrige kommando.
  • cd !$ utfører cd på det siste argumentet i forrige kommando.
  • Trykk Opp for å hente den forrige kommandolinjen, og rediger den å endre mkdir til cd.

¹ pass imidlertid på at det fungerer ikke i ksh93 siden u+ versjonen , fast i 93u + m / 1.0.0-alpha + d1483150 2021-01-05

Kommentarer

  • Takk! Esc. virker mest praktisk for meg, gjør nøkkelsekvensen har noen spesielle m spiser?
  • Det ‘ er bare Bash (og arvet fra ksh, og fungerer også i zsh) sekvens for » gjenta siste ord i forrige kommando «. Jeg bruker det ganske ofte.
  • @Gilles I ‘ Jeg begynner å tenke at » Gilles » kontoen deles faktisk av et ekspertpanel. 😉
  • @StephaneChazelas /a/b/..// ville faktisk fungert, men ikke /a/b/../c. Fikset. Jeg ‘ har stilt spørsmålet til et bredere publikum.
  • mkcd() { mkdir -p "$1" && cd "$1"; } virker ikke ‘ t å være et problem i (min forekomst av) 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 oppsettet og) viser /tmp/here/foo som er det som ble opprettet (og det jeg forventet). bash feilaktig oppretter og endrer til /var/tmp/somewhere/foo.

Svar

Det ville aldri ha skjedd meg å skrive opp denne oppførselen fordi jeg skriver inn følgende på nærtidsbasis …

$ mkdir someDirectory<ENTER> $ cd !$ 

der bash erstatter !$ med det siste ordet i siste linje; dvs. det lange katalognavnet du skrev inn.

I tillegg er fullføring av filnavn din venn i slike situasjoner. Hvis den nye katalogen din var den eneste filen i mappen, ville en rask dobbel TAB gi deg den nye katalogen uten å gå inn på nytt.

Selv om det er kult at bash tillater deg å skript opp slike vanlige oppgaver som de andre svarene antyder, jeg synes det er bedre å lære redigeringsfunksjonene for kommandolinjen som bash har å tilby, slik at når du jobber på en annen maskin, mangler du det syntaktiske sukkeret som dine tilpassede skript gir.

Kommentarer

Svar

Hvis du bruker Oh My Zsh, there «sa command called take som gjør akkurat dette. Det vil se ut som dette.

take myfolder 

Jeg fant denne faktisk ved et uhell. Jeg så bare og den står oppført på dette cheatsheat fra Oh My Zsh GitHub-wiki. Det er ganske nyttig kommando, og tilsynelatende veldig enkelt å lage deg selv.

Kommentarer

  • Jeg visste aldri om take 🙂 Perfekt! btw – iTerm2 med Oh My Zsh. Det er faktisk 3 perfekte svar her. Denne, den av @jes ú s-carrera, og det valgte svaret. Avhenger av oppsettet og preferansen din.

Svar

I henhold til Hvilke tilpasninger har du gjort på skallprofilen din for å øke produktiviteten? , slik gjør jeg det:

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

det betyr at det også fungerer hvis katalogen allerede eksisterer.

Kommentarer

  • -p alternativet til mkdir vil undertrykke feil.
  • mcd er en allerede eksisterende kommando. Selv om du ‘ nettopp har gitt et eksempel, brukte jeg den selv som den ‘ en bokstav kortere enn mkcd.
  • @Dharmit Shah: Hva er den eksisterende mcd -kommandoen? Hvilken pakke eller prosjekt gir denne kommandoen?
  • mtools gir mcd-kommandoen. Hans manside sier » MCD-kommandoen brukes til å endre mtools arbeidskatalog på MS-DOS-disken. »

Svar

Eller du kan bare lage en kort variabel på farten og bruke den to ganger x = longproject ; mkdir $x ; cd $x – som jeg innrømmer er fortsatt lenger enn å bruke en shellscript-funksjon 🙂

Svar

Dette er en enkel ting å gjøre i et bash-skript / -funksjon. Jeg opprettet en veldig lesbar og tilstrekkelig dokumentert opplæring inkludert skript som fungerer på både Linux og MacOS (dette vil også bli opprettholdt i fremtiden).

Målet mitt for opplæringskompleksiteten er: skrevet for et målrettet publikum med de eneste forutsetningene for at brukeren har en puls og kan lese engelsk, så vennligst gi tilbakemelding hvis du trenger hjelp.

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 å installere dette har du to alternativer:

  • Først er å legge til funksjonen i .bashrc -filen.
  • Den andre er å legge til filen i banen og kild filen i .bash_profile -filen.

Igjen, README-filen er veldig detaljert om hvordan du gjør dette.

Lykke til!

Svar

Her «er en liten variant som er verdt å nevne:

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

Legg dette til deg ur ~/.bash_profile og du kan deretter bruke mkdir som normalt (når du først har source » d it), bortsett fra nå, vil den kjøre funksjonen ovenfor i stedet for standard mkdir -kommandoen.

Merk, dette validerer ikke inndata i henhold til den aksepterte svar av Gilles , men viser hvordan du (effektivt) kan overstyre innebygde.

Fra dokumenter (parafraserer litt):

command mkdir [args] kjører mkdir med args ignorerer en hvilken som helst skallfunksjon med navnet mkdir. Bare shell-innebygde kommandoer eller kommandoer funnet ved å søke i PATH blir utført. Hvis det er en skallfunksjon kalt ls, kjører command ls i funksjonen den eksterne kommandoen ls i stedet for å ringe til funksjonen rekursivt

Jeg tror builtin oppnår et lignende resultat som command.

Kommentarer

  • du bør absolutt sitere $dir
  • @Jeff, enig, men det aksepterte svaret har all validering man trenger.Jeg ‘ presenterer nettopp bruken av command som et alternativ.

Svar

Legge til hjelperfunksjon i BASH, ZSH eller KSH

Opprett mkcd kommando til miljøet ditt i en linje

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

Svar

Hvis du bruker Oh-my-zsh , take -kommandoen gjør susen. Ta en titt på jukseark .

Svar

Bare automatiserte svarene ovenfor og laget et engangs kjørbart skript:

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

Bare kopier dette i en ny fil mkcd.sh og kjør den bare en gang i terminalen av bash mkcd.sh. Utfør deretter source ~/.bashrc for å få det til å fungere i den aktuelle økten.

Etter dette kan du bruke mkcd some_dir for å opprette og skriv direkte inn i den katalogen.

Kommentarer

  • Du foreslår at du skriver et skript (i en fil) hvis eneste formål er å legge til ~/.bashrc fil (med et svar som allerede er gitt)? Og hvordan foreslår du at du oppretter dette mkcd.sh skriptet? Med en redaktør, kanskje? Dette ser ut som mer arbeid enn bare redigering av ~/.bashrc. Hvilken fordel har dette fremfor det aksepterte svaret? ………………………………………………………………………… P.S. Dette vil mislykkes på grunn av sitater, noe som forteller meg at du ikke engang har prøvd det selv.
  • Jeg beklager å si, men ja, da jeg skrev i svaret mitt, brukte jeg svarene ovenfor. Det fungerer. Hvis du ikke tror ‘, prøv det. Og om ikke å prøve, brukte jeg hele dagen til å skrive slike skript i bash og python i dag.
  • Jeg prøvde det du skrev. Det fungerer ikke .

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *