Menu Chiudi

Ripetizioni con la bash…

No, non vi sto consigliando di prendere lezioni private per l’uso della bash :D

alt.png

Invece mi riallaccio al mio vecchio post “Shell: alcune interessanti combinazioni di tasti” e vi presento un’altra combinazione di tasti di cui non riesco proprio a fare a meno


La combinazione di tasti “Alt .” (sì, quello è un punto) serve a ripetere parti dei comandi precedenti, che la bash ha in memoria. Premere più volte la combinazione ci porta indietro tra i comandi, in base allo storico della shell.

Esempio

Avete presente la classica situazione in cui abbiamo a che fare ripetutamente con nomi di file molto lunghi e magari localizzati in percorsi assurdi? Faccio un esempio, ho questi file e percorsi:

1 /media/hda5/tmp/modello_fattura2/
2 /Doc/fgenerator/examples/fattura_evasore_fiscale.pdf
3 /media/hda3/watch_out_where_the_huskies_go/
4 /home/felipe/dont_you_eat_the_yellow_snow.txt

Immaginiamo di dover spostare 4 in 3, successivamente 3 in 1, e infine 2 in 1.¹ Ecco come questa combinazione di tasti ci semplificherebbe la vita:

$: mv  /home/felipe/dont_you_eat_the_yellow_snow.txt /media/hda3/watch_out_where_the_huskies_go/
$: mv ALT . /media/hda5/tmp/modello_fattura2/
$: mv /Doc/fgenerator/examples/evasore_fiscale.pdf ALT .

Abbiamo risparmiato circa il 30% del lavoro, senza bisogno di ripetere percorsi o nomi di file che avevamo già immesso. Sembra un processo macchinoso, ma credetemi: appena cominciate ad usarlo sembrerà totalmente naturale e vi prometto che non dovrete far altro che premere “Alt .”, al massimo due/tre volte se non vi pesca subito quello che vorreste.

Immaginate di approfittare di questo trucco nell’uso quotidiano della bash, quando capita di dover riscrivere diecimila volte le stesse cose ;)

[¹] Lo so che è un esempio totalmente stupido :D

20 commenti

  1. Luca

    Fate bene attenzione a dove vanno gli husky e trattenetevi dal mangiare la neve gialla.
    Parole sante !

  2. Luxman

    Caruccio! Si può sostituire il punto con una parentesi angolare? Sarebbe più comodo per me :D

  3. hronir

    Felipe dice:
    “serve a ripetere parti dei comandi precedenti”

    Intendevi dire:
    “serve a ripetere l’ultima parte di comandi precedenti”

    giusto?
    Io ho dovuto provare concretamente per capire cosa diavolo facesse l’ALT .… :)

  4. gigidn

    Visto che non lo visto questa combinazione ne in questo ne nell’altro posto la riporto.

    CTRL Z
    bg %n / fg %n

    la prima combinazione era stata mostrata e manda a nanna un processo, il processo e’ stoppato e non va avanti. Se volete mandarlo a nanna e farlo girarare allora bisogna dare “bg %n” dove %n e’ il numero del processo che esce con CTRL Z.

    fg %n e’ gia’ stato spiegato lo riporto solo per completezza.

    Non so proprio delle semplici combinazioni di tasti ma anche dei comandi, credo comunque possan essere utili ed in tema con il post.

  5. Robbie

    FELIPE!!!
    Lo sognavo la notte questo comando!
    Lo desideravo da tempo….e pure la mia povera tastiera :D

    Ma per caso c’è una combinazione per tornare indietro
    se per esempio ehm preso dalla foga una arriva al comando che
    gli interessa e lo ehm oltrepassa?

  6. axs

    Io uso tantissimio CTRL R e CTRL S.
    Scrivi un paio di lettere di una vecchia riga di comando che ti ricordi e poi premi ctrl r (eventualmente ripetuto) per cercare (r = indietro, s=avanti) nella history le righe di comando che contengono quelle lettere.
    E come un tab (autocompletamento) che lavora sulla history anziche’ sul path.
    In questo modo non devo premere 4000 volte la pressione del tasto FRECCIA SU per cercare una riga vecchia.

    CIAO

  7. Andrea (Z3n0)

    Ok, è una delle combinazioni di tasti più utili in assoluto, ma hai dimenticato un’altra combinazione che a questa si lega: “Alt -” (si, quello è un meno ^_^)

    quotando la descrizione del comando dato da hronir, “serve a selezionare (a ritroso) la parte da ripetere di comandi precedenti”

    con un’esempio si dovrebbe capire meglio: mettiamo di aver dato
    cp pippo.txt pluto.txt directory/
    e di voler spostare pluto.txt in altra_directory… basta usare
    mv Alt – Alt . altra_directory/
    se avessimo invece voluto spostare pippo.txt sempre in altra_directory, bastava
    mv Alt – 2 Alt . altra_directory/
    dove con “2” si indica la posizione da ripetere: la “-2” (nell’esempio, cp sarebbe stato la “-3”)

    Infine, con Alt . è possibile andare a ritroso selezionando parti dei comandi precedenti: basta ripetere la combinazione più volte (o anche premere più volte il “punto” mantenendo premuto l’ “alt”): tornando all’esempio, nel caso fossero stati eseguiti nell’ordine
    cp pippo.txt pluto.txt directory/
    mv Alt – Alt . altra_directory/
    e volessimo spostare pippo.txt sempre in altra_directory, basta
    mv Alt – 2 Alt .. Alt .

  8. Lazza

    Ciao Felipe, volevo sapere se potevi consigliarmi dei comandi per fare queste cose:
    1. Io ho una cartella con dei file, quelli più grandi di 1 mega li voglio lasciare fermi e quelli più piccoli di un mega li voglio spostare tutti in una cartella.
    2. Questi file hanno tutti il nome che inizia per una stringa di caratteri uguale. Io vorrei toglierla senza rinominarli uno alla volta. Si può fare?

  9. Andrea

    1) probabilmente find e poi | xargs

    2) non mi ricordo come si fa’ in bash (dovrebbe essere # per i prefissi e % per i suffissi), qualcosa tipo:
    for a in *; do echo mv $a ${a#prefisso}; done
    prendilo con le pinze perche’ nummericordo, non dovrebbe fare danni dato che c’e’ un “echo” prima del “mv”, comunque fai attenzione.

    Con zsh e’ più facìle:
    mv $a{a:s/foo/bar}
    mi raccomando, non installate zsh, ha un manuale leggermente un po’ piu’ piccolo di Emacs,
    ls **/* rulez, come Alt-q, Atl-u e Alt-x

  10. Andrea (Z3n0)

    1) dalla directory in cui hai i file (nel caso contrario devi specificare il percorso)
    find * -maxdepth 0 -size -1m -exec /bin/mv {} path\/destinazione\/ \;
    prendila comunque con le molle e per sicurezza prima fagli fare un’echo del comando ( -exec /bin/echo /bin/mv {} path\/destinazione\/ \; )

  11. Andrea (dnc)

    Chiaramente sopra dovevo scrivere:
    mv $a ${a:s/foo/bar}
    se anche adesso sparisce lo spazio e il dollaro davanti alla prima graffa, e’ colpa di wordpress… (=

  12. asymmetric

    forse è un po’ tardino ma a qualcuno può essere utile:

    la combinazione !command ripete l’ultima chiamata di command comprensiva di flag parametri e tutto il resto..

    è molto utile quando avete digitato una stringa di comandi e parametri molto lunga un bel po’ di tempo addietro, e non volete scorrere la lista ma per l’appunto vi ricordate il comando..

    ad esempio:
    rsync –verbose –progress –stats –compress –rsh=/usr/local/bin/ssh
    –recursive –times –perms –links –delete \
    –exclude “*bak” –exclude “*~” \
    /www/* webserver:simple_path_name

    […]
    !rsync

    ciao :)
    asy

  13. lingegnere

    > Ma per caso c’è una combinazione per tornare indietro
    > se per esempio ehm preso dalla foga una arriva al comando che
    > li interessa e lo ehm oltrepassa?

    Con zsh, usando l’undo, Ctrl-_ o Ctrl-/ oppure cerca il keybind se qualcuno ha modificato la configurazione, qualcosa tipo Alt-x where-is Enter undo Enter. Se usi ancora bash devi guardare nel fine manuale…

Rispondi

Scopri di più da pollycoke :)

Abbonati ora per continuare a leggere e avere accesso all'archivio completo.

Continue reading

Vai alla barra degli strumenti