GNU/Linux >> Znalost Linux >  >> Linux

Jak provést příkaz při každé změně souboru?

Jednoduché, pomocí inotifywait (nainstalujte inotify-tools vaší distribuce balíček):

while inotifywait -e close_write myfile.py; do ./myfile.py; done

nebo

inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
  ./myfile.py         # or "./$filename"
done

První úryvek je jednodušší, ale má významnou nevýhodu:nebudou v něm chybět změny provedené během inotifywait neběží (zejména když myfile běží). Druhý úryvek tuto vadu nemá. Mějte však na paměti, že předpokládá, že název souboru neobsahuje mezery. Pokud je to problém, použijte --format možnost změnit výstup tak, aby nezahrnoval název souboru:

inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
  ./myfile.py
done

V každém případě existuje omezení:pokud nějaký program nahradí myfile.py s jiným souborem místo zápisu do existujícího myfile , inotifywait zemře. Mnoho editorů pracuje tímto způsobem.

K překonání tohoto omezení použijte inotifywait v adresáři:

inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
  if [ "$filename" = "myfile.py" ]; then
    ./myfile.py
  fi
done

Případně použijte jiný nástroj, který používá stejnou základní funkcionalitu, jako je incron (umožňuje vám registrovat události, když je soubor upraven) nebo fswatch (nástroj, který funguje také na mnoha dalších variantách Unixu, přičemž každá varianta používá analog linuxového inotify).


vstup (http://entrproject.org/) poskytuje přívětivější rozhraní pro inotify (a také podporuje *BSD a Mac OS X).

Díky tomu je velmi snadné určit více souborů ke sledování (omezeno pouze ulimit -n ), odstraňuje potíže při práci s nahrazovanými soubory a vyžaduje méně bash syntaxe:

$ find . -name '*.py' | entr ./myfile.py

Používal jsem ho v celém zdrojovém stromě svého projektu ke spouštění testů jednotek pro kód, který právě upravuji, a už teď to byla obrovská podpora mého pracovního postupu.

Příznaky jako -c (mezi běhy vymažte obrazovku) a -d (ukončit, když je do sledovaného adresáře přidán nový soubor) přidat ještě větší flexibilitu, například můžete:

$ while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; done

Na začátku roku 2018 je stále v aktivním vývoji a lze jej nalézt v Debianu a Ubuntu (apt install entr ); stavba z autorského repa byla v každém případě bezbolestná.


Napsal jsem program v Pythonu, který přesně toto provedl, s názvem when-changed.

Použití je jednoduché:

when-changed FILE COMMAND...

Nebo chcete-li sledovat více souborů:

when-changed FILE [FILE ...] -c COMMAND

FILE může být adresář. Sledujte rekurzivně s -r . Použijte %f pro předání názvu souboru příkazu.


Linux
  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Jak mohu zkontrolovat, zda soubor existuje, a provést příkaz, pokud ne?

  3. Jak upravit textový soubor v mém terminálu

  1. Proveďte příkaz, kde je nalezen soubor?

  2. Jak spustit soubor PL v Linuxu?

  3. Příkaz Shell pro sledování změn v souboru

  1. Jak náhodně vzorkovat podmnožinu souboru?

  2. Jak připojit výstup do souboru?

  3. Jak vygenerovat částečný kontrolní součet souboru