Am găsit că repet multe:
mkdir longtitleproject cd longtitleproject
Există o modalitate de a o face într-o singură linie fără a repeta numele directorului? Sunt „bash aici.
Comentarii
-
mcd
de la unix.stackexchange.com/questions/6628/… - Înrudit (dar mai general): Rulați două comenzi pe un singur argument (fără script) .
-
mkdir longtitleproject
apoicd !^
- De asemenea, a fost acoperit pe askubuntu.com/q/927463/295286 și askubuntu.com/q/249314/295286
Răspuns
Acesta este one-liner de care aveți nevoie. Nu este necesară nicio altă configurare:
mkdir longtitleproject && cd $_
Variabila $_
, în bash, este ultimul argument dat comenzii anterioare. În acest caz, numele directorului pe care tocmai l-ați creat. După cum este explicat în 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.
Utilizați cd $_
pentru a prelua ultimul argument mențiunea comenzii anterioare în loc de cd !$
deoarece cd !$
oferă ultimul argument al comenzii anterioare în istoricul shell :
cd ~/ mkdir folder && cd !$
ajungi acasă (sau ~ /)
cd ~/ mkdir newfolder && cd $_
ajungeți în folderul nou sub casă !! (sau ~ / newfolder)
Comentarii
nu este ergonomic. Apreciez faptul că ‘ nu depinde de mediu și este ‘ util să știți. Mulțumesc!
Răspuns
Nu există nicio comandă încorporată, dar puteți scrie cu ușurință o funcție care apeluri mkdir
apoi cd
:
mkcd () { mkdir "$1" cd "$1" }
Introduceți acest cod în fișierul dvs. ~/.bashrc
(sau ~/.kshrc
pentru utilizatorii ksh sau ~/.zshrc
pentru utilizatorii zsh). Acesta definește o funcție numită mkcd
. "$1"
va fi înlocuit cu argumentul funcției atunci când o rulați.
Această versiune simplă are mai multe defecte:
- Nu puteți crea un lanț de subdirectoare simultan. Remediați: treceți opțiunea
-p
lamkdir
. (Acest lucru poate fi sau nu de dorit, deoarece crește riscul ca o greșeală de tipar să nu fie detectată, de ex.mkcd mydierctory/newsub
va crea fericitmydierctory
șimydierctory/newsub
când intenționați să creaținewsub
în interiorul existentmydirectory
.) - Dacă argumentul începe cu
-
, dar nu este doar-
, apoimkdir
șicd
îl vor interpreta ca o opțiune. Dacă este doar-
, atuncicd
îl va interpreta ca însemnând$OLDPWD
. Dacă it „s+
urmat de 0 sau mai multe cifre, apoicd
în zsh îl va interpreta ca un index în stiva de directoare. Puteți remedia prima problemă, dar nu și celelalte două, trecând--
înainte de argument. Puteți rezolva toate aceste probleme anticipând./
la argument dacă este „o cale relativă. -
mkdir
nu urmeazăCDPATH
, darcd
o face, deci dacă ați setatCDPATH
la o valoare care nu „începe cu.
(o configurație oarecum oarecum neobișnuită), atuncicd
vă poate duce la un director diferit cel care tocmai a fost creat.Prevederea./
pentru căile relative remediază acest lucru¹ (face caCDPATH
să fie ignorat). - Dacă
mkdir
eșuează, încearcă să executecd
. Remediere: utilizați&&
pentru a separa cele două comenzi.
Încă destul de simplu:
mkcd () { case "$1" in /*) :;; *) set -- "./$1";; esac mkdir -p "$1" && cd "$1" }
Această versiune are încă potențialul de a face ca cd
să intre într-un director diferit de cel că mkdir
tocmai a fost creat într-un caz de margine: dacă argumentul pentru mkcd
conține ..
și trece printr-o legătură simbolică. De exemplu, dacă directorul curent este /tmp/here
și mylink
este o legătură simbolică către /somewhere/else
, apoi mkdir mylink/../foo
creează /somewhere/else/foo
în timp ce cd mylink/../foo
se schimbă în foo
. Nu este suficient să căutați legături simbolice în argument, deoarece shell-ul urmărește și link-uri simbolice în propriul director curent, astfel încât cd /tmp/mylink; mkdir ../foo; cd ../foo
nu se schimbă în noul director (/somewhere/else/foo
), dar în /tmp/foo
. O soluție pentru aceasta este să lăsați cd
integrat să rezolve toate ..
componentele căii mai întâi (nu are sens să folosiți foo/..
dacă foo
nu ” nu există, așa că mkdir
nu trebuie să vadă niciodată ..
).
Ajungem la acest lucru robust, dacă este ușor sângeros 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 }
(Exercițiu: de ce folosesc un subshell pentru prima cd
apel?)
Dacă mkdir nu reușește, vreau să fiu sigur că nu schimb directorul curent. Schimbarea înapoi cu cd – sau $ OLDPWD nu este suficient de bună dacă shell-ul nu are permisiunea de a se schimba în directorul său curent. De asemenea, apelarea cd-urilor actualizează OLDPWD, deci vrem să o facem o singură dată (sau să restaurăm OLDPWD).
Există și modalități mai puțin specializate pentru a nu fi necesar să tastați din nou cuvântul din linia anterioară:
- Tastați
cd
, apoi Esc . (sau Alt + . ) pentru a insera ultimul argument din comanda anterioară. -
cd !$
executăcd
pe ultimul argument al comenzii anterioare. - Apăsați Sus pentru a reaminti linia de comandă anterioară, apoi editați-o pentru a schimba
mkdir
încd
.
¹ ai grijă totuși că nu funcționează în ksh93 din versiunea u+
, fixată în 93u + m / 1.0.0-alfa + d1483150 2021-01-05
Comentarii
- Mulțumesc! Esc. mi se pare cel mai convenabil, face secvența de taste au orice m special eaning?
- Este ‘ doar Bash (și moștenit de la
ksh
și funcționează și înzsh
) secvență pentru ” repetați ultimul cuvânt al comenzii anterioare „. O folosesc destul de des. - @Gilles ‘ încep să cred că ” Gilles ” contul este de fapt partajat de un grup de experți. 😉
- @StephaneChazelas
/a/b/..//
ar funcționa de fapt, dar nu/a/b/../c
. Fix. Am ‘ am adresat întrebarea unui public mai larg. -
mkcd() { mkdir -p "$1" && cd "$1"; }
nu ‘ pare a fi o problemă în (instanța mea) 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
(include configurarea și) afișează/tmp/here/foo
care este ceea ce a fost creat (și ceea ce mă așteptam).bash
în mod eronat creează și se modifică în/var/tmp/somewhere/foo
.
Răspuns
Nu mi-ar fi trecut niciodată prin minte să scriu acest comportament, deoarece introduc următoarele în aproape o oră …
$ mkdir someDirectory<ENTER> $ cd !$
unde bash înlocuiește cu amabilitate !$
cu ultimul cuvânt din ultima linie; adică numele lung al directorului pe care l-ați introdus.
În plus, completarea numelui de fișier este prietenul dvs. în astfel de situații. Dacă noul dvs. director a fost singurul fișier din dosar, o dublă rapidă TAB vă va oferi noul director fără să îl reintroduceți.
Deși este bine că bash-ul vă permite pentru a crea sarcini obișnuite, așa cum sugerează celelalte răspunsuri, cred că este mai bine să învățați caracteristicile de editare pe linia de comandă pe care bash le oferă, astfel încât atunci când lucrați la o altă mașină să nu vă lipsească zahărul sintactic pe care îl oferă scripturile dvs.
Comentarii
- Există un loc bun pentru a afla despre cele mai importante ciudățenii bash ca acesta?
- @ dominicbri7 În general se află sub ” editarea liniei de comandă bash ” Googling același lucru dă următoarele ca rezultat de top web.mit.edu/gnu/doc/html/features_7.html Mai exact,! $ este un exemplu de Word Designator vezi gnu.org/software /bash/manual/bashref.html#Word-Designators
Răspuns
Dacă utilizați Oh, Zsh, există o comandă numită ia care face exact acest lucru. Ar arăta cam așa.
take myfolder
De fapt l-am găsit accidental. Tocmai m-am uitat și este listat pe acest cheatsheat din wiki-ul Oh My Zsh GitHub. Este o comandă destul de utilă și aparent foarte ușor de creat.
Comentarii
- Nu am știut niciodată despre
take
🙂 Perfect! btw – iTerm2 cu Oh My Zsh. Există de fapt 3 răspunsuri perfecte aici. Acesta, cel de @jes ú s-carrera și răspunsul selectat. Depinde de configurare și preferință.
Răspuns
Conform Ce personalizări ați făcut pe profilul dvs. de shell pentru a crește productivitatea? , așa o fac:
# make a directory and cd to it mcd() { test -d "$1" || mkdir "$1" && cd "$1" }
înseamnă că funcționează și dacă directorul există deja.
Comentarii
- Opțiunea
-p
pentru mkdir va suprima erorile. - mcd este o comandă deja existentă. Deși ‘ tocmai ați dat un exemplu, l-am folosit eu ca ‘ o literă mai scurtă decât mkcd.
- @Dharmit Shah: Care este comanda existentă
mcd
? Ce pachet sau proiect oferă această comandă? - mtools furnizează comanda mcd. Pagina sa de manual spune ” Comanda mcd este utilizată pentru a schimba directorul de lucru mtools de pe discul MS-DOS. ”
Răspuns
Sau puteți crea o variabilă scurtă din mers și să o utilizați de două ori x = longproject ; mkdir $x ; cd $x
– care recunosc că este încă mai lung decât utilizarea unei funcții shellscript 🙂
Răspuns
Acesta este un lucru simplu de făcut într-un script / funcție bash. Am creat un tutorial foarte lizibil și suficient de documentat, inclusiv scripturi care funcționează atât pe Linux, cât și pe MacOS (acest lucru va fi menținut și în viitor).
Scopul meu pentru complexitatea tutorialului este: scris pentru un public vizat cu singurele condiții prealabile pentru care utilizatorul are un impuls și poate citi limba engleză, așa că vă rugăm să oferiți feedback dacă aveți nevoie de asistență.
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
Pentru a instala acest lucru aveți două opțiuni:
- Mai întâi este să adăugați funcția la fișierul dvs.
.bashrc
. - Al doilea este să adăugați fișierul la calea dvs. și apoi sursați fișierul în fișierul
.bash_profile
.
Din nou, fișierul README este foarte detaliat despre cum să faceți acest lucru.
Noroc!
Răspuns
Aici „o variantă ușoară care merită menționată:
function mkdir() { local dir=$1 command mkdir "$dir" && cd "$dir" }
Adăugați acest lucru la yo ur ~/.bash_profile
și puteți utiliza apoi mkdir
ca de obicei (odată ce ați „divizat source
” d it), cu excepția acum, va rula funcția de mai sus, mai degrabă decât comanda standard mkdir
.
Rețineți, acest lucru nu validează intrarea conform Răspunsul lui Gilles , dar demonstrează modul în care (efectiv) puteți suprascrie elementele încorporate.
docs (parafrazând ușor):
command mkdir [args]
ruleazămkdir
cuargs
ignorând orice funcție shell denumitămkdir
. Se execută numai comenzile încorporate în shell sau comenzile găsite prin căutarea în PATH. Dacă există o funcție shell denumităls
, rulareacommand ls
în cadrul funcției va executa comanda externăls
în loc să apelați funcția recursiv
Cred că builtin
obține un rezultat similar cu command
.
Comentarii
- ar trebui să citați cu siguranță
$dir
- @Jeff, a fost de acord, dar răspunsul acceptat are toate validările de care ar avea nevoie.’ doar prezint utilizarea
command
ca alternativă.
Răspuns
Adăugarea funcției de asistență la BASH, ZSH sau KSH
Creați comanda mkcd
în mediul dvs. în o linie
echo -e "mkcd() {\n mkdir -p "$1" && cd $_\n}" >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Răspuns
Dacă utilizați Oh-my-zsh , take
va face trucul. Aruncați o privire la foaia de înșelăciune .
Răspundeți
Tocmai a automatizat răspunsurile de mai sus și a creat un script executabil o singură dată:
fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc
Doar copiați acest lucru într-un fișier nou mkcd.sh
și rulați-l o singură dată în terminal de bash mkcd.sh
. Apoi executați source ~/.bashrc
pentru ca acesta să funcționeze în sesiunea curentă.
După aceasta, puteți utiliza mkcd some_dir
pentru a crea și introduceți direct în acel director.
Comentarii
- Vă sugerăm să scrieți un script (într-un fișier) al cărui singur scop este să se atașeze la
~/.bashrc
fișier (cu un răspuns care a fost deja dat)? Și cum sugerați să creați acest scriptmkcd.sh
? Cu un editor, poate? Acest lucru pare a fi mai mult de lucru decât simpla editare~/.bashrc
. Ce avantaj are acest lucru față de răspunsul acceptat? ………………………………………………………………………… P.S. Acest lucru va eșua din cauza problemelor de citare, ceea ce îmi spune că nici măcar nu ați încercat-o singur. - Îmi pare rău să spun, dar da, așa cum am scris în răspunsul meu, am folosit răspunsurile de mai sus. Funcționează. Dacă nu ‘ nu mă credeți, încercați. Și despre faptul că nu încerc, am folosit ziua mea completă pentru a scrie astăzi astfel de scripturi în bash și python.
- Am încercat ceea ce ați scris. Nu funcționează.
mkdir foo && cd foo
, care nu este ‘ t la îndemână.&& cd $_
deoarece tastele sunt atât de departe de rândul de acasă, deci, deși corect din punct de vedere tehnic, nu