Shell parancsok futtatása több könyvtárban, batch execute

Azok számára lehet hasznos ez a szkript, akiknek napról napra ugyanazokat a parancsokat kell kiadniuk a könyvtárszerkezet különböző részein, például sok Git repo-t tartanak, viszont push-olni csak a nap végén szeretnének.

Mosh: Run shell commands in multiple directories grouped by tags

For developers who running the same command in different directories repeatedly, Mosh is a productivity tool that saves time by executing the command without having to change the directory. Unlike other similar tools, Mosh does not bound to a certain software (like Git for example), it can execute any shell commandIt works on any Bash-compitable shell (Bash, Zsh, Git Bash on Windows, etc.).

https://github.com/bimlas/bash-mosh

Örömmel venném, ha további felhasználási ötleteket adnátok, mert ugyan a program nincs kifejezetten egy célhoz kötve (pl. Git repo-k kezelése), de nem tudok rá túl sok példát, hogy mire lehetne még használni.

Hozzászólások

Pl shared hosting szerveren WordPress + pluginek frissítése wp-cli -vel

Ilyesmire `xargs -P`-t használok, az mindenhol telepítve van.

A mosh amúgy elég szerencsétlen névválasztás lett, ha még esetleg nem ismernéd a mosh-t (https://mosh.org/), nagyon hasznos tud lenni!

Kösz a figyelmeztetést - frankó, az összes '*sh' név már foglalt... (-_-')

Tanácsot szeretnék kérni: ha átnevezek egy projektet, azt vajon hogy jelezzem a felhasználóknak? Ha valaki csak befrissíti a szkriptet, egyáltalán nem biztos, hogy megnézi a changelog-ot, ergo olyan megoldás lenne jó, amit egyből látnak... Az jut most hirtelen eszembe, hogy meghagyom a Mosh szkriptet is egy eygszerű `echo "Megvaltozott a neve"` utasitassal es a kovetkezo release-nel már törlöm a szkriptet, de ez valahogy nyakatekertnek tűnik.

Ja, plusz a config fájlok (~/.mosh) útvonala is megváltozik, tehát egyértelműen jelezni kell nekik.

Eleve a config fájlokat nem illik a ~/.mosh alá tenni, hanem az $XDG_CONFIG_HOME/mosh/ alá, fallback pedig a $HOME/.config/. Bash esetén: ${XDG_CONFIG_HOME:-$HOME/.config/} a szintaxis amit keresel.

A névcserét én úgy oldanám meg, hogy egy warning (szépen, színesen) a következő hónapban kiírja hogy most már mush (vagy akármi) a cucc neve, használja azt (nyilván ha az új néven hívja meg, akkor nincs warning). A második hónapban pedig. Le kell okézni, hogy megértette, a harmadik hónaptól meg már nincs mosh.

Természetesen. Amikor ki akarom nyírni a virtuozzo-ra telepített microservice-es alkalmazást (mondjuk redeploy miatt), akkor ezt szoktam meghívni:

export DC_NAME=kmarc_dc

ssh vz -- "sudo vzlist      --all | awk '/\s${DC_NAME}/{ print \$1 }' | xargs -n1 -P6 sudo prlctl stop"
ssh vz -- "sudo vzlist      --all | awk '/\s${DC_NAME}/{ print \$1 }' | xargs -n1 -P6 sudo prlctl delete"
ssh vz -- "sudo prlctl list --all | awk '/\s${DC_NAME}/{ print \$1 }' | xargs -n1 -P6 sudo prlctl stop"
ssh vz -- "sudo prlctl list --all | awk '/\s${DC_NAME}/{ print \$1 }' | xargs -n1 -P6 sudo prlctl delete"

Magyarázat:

  1. ssh-zik a vz hostra
  2. listázza a vz containereket/vm-eket
  3. awk-val kiszedi a container/vm nevét
  4. xargs-szal meghívja a container/vm stop / delete-et

A paraméterlistában az n1 megmondja, hogy egy argumentumot feedeljen processzenként, a P6 pedig azt, hogy egyszerre max 6-ot futtasson belőlük.

Egy-két éve rábukkantam neten valakinek egy programjára/scriptjére, amit kifejezetten arra lehetett használni, hogy több, saját alkönyvtárában lévő "verziókezelt" cuccra egyszerre lehessen parancsokat kiadni, mindezt több különböző verziókezelőre megoldva. (Tehát ha pl. frissítést kérünk, akkor érzékeli, hogy egy projekt mondjuk gitet használ, akkor arra tol egy `git pull`-t, ha SVN-es, akkor annak megfelelően frissít stb.) A baj az, hogy fogalmam sincs, mi volt ez a program, és hol található, pedig azóta kerestem már párszor. =(

Az én .bashrc-mben erre van egy recursive git pull alias:

alias git-recursive-pull='for d in $(find . -type d -name .git -printf "%h\n"); do (echo ***$d*** && cd $d && git pull --all && echo); done'

Ez minden subdirben, ami git subdir, kiadja a git pull --all parancsot.

Nyilvánvalóan cégenként / customerenként meg van minden fő git könyvtárra határozva, hogy a pull hogy viselkedjen (autostash, rebase, merge, stb.), egyedül a --all -ra nem jöttem rá hogy lehetne gitconfig-ból ?‍♂️