You’ve come to the right place if you want to learn how to run Linux commands when any file in a working directory change and when new files are created.
In Linux, you may use
cron to schedule commands to run at certain times.
But what if you need commands to be run every time a file is modified, or a new file is added to a directory?
That’s also easily achievable, and there are some command-line tools to perform that.
Let’s get started!
watchexec is a handy and standalone tool that monitors a given working directory and executes a command if it detects any changes like file updation or new file creation.
- It does not require a complex command line involving
- Checks for changes in the current directory and all subdirectories in real-time.
- There is no need for a language runtime, and it is not connected to any specific language or ecosystem.
- .gitignore and .ignore are used by default to decide which files to ignore notifications for.
- Process groups are used to keep track of forking programs.
- Watching files with a certain extension is supported.
- It’s compatible with OS X, Linux, and Windows.
- Filtering and ignoring events based on glob (File-search patterns for finding partially identical filenames is possible.
Installation of watchexec
To easily install
watchexec tool, paste the following link into the terminal or a shell prompt, and press enter.
Linux & macOS
curl -sS https://webinstall.dev/watchexec | bash
After the successful installation, the path will be displayed on the screen. In my case, this tool was installed in
┌──(root💀kali)-[~] └─# curl -sS https://webinstall.dev/watchexec | bash Thanks for using webi to install 'watchexec@stable' on 'Linux/x86_64'. Have a problem? Experience a bug? Please let us know: https://github.com/webinstall/webi-installers/issues Lovin' it? Say thanks with a Star on GitHub: https://github.com/webinstall/webi-installers Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec
And after installation, navigate to the
.local/bin repository and check whether the file is there or not by using these commands.
cd .local/bin ls
The next step is to export the path to use the watchexec tool.
To run, Just type
watchexec in the terminal as a root user. Use this command to see which flags and options can be used with watchexec tool.
Sample Example Commands
ls -lawhen any file changes in this directory/subdirectory. This command shows all the files present in the directory whenever it detects any modification.
watchexec -- ls -la
- Whenever any of the python, js, CSS, or Html extension files in the current directory change, run the command. Here you can pass any command you want. The file extensions should be separated by a comma.
watchexec --exts py,js,css,html <command>
- Run command when any file in
srcchanges. “-w” option watches a specific file or directory in the system.
watchexec -w lib -w src <command>
- Call/restart any service when any file in the current directory (and all subdirectories) changes.
watchexec -e html -r tor watchexec -e js,py -r mysql
Here, “-r” option restarts the process or service if it’s running in the system.
For more watchexec usage examples, you can visit the official GitHub repository.
entr is a simple and excellent command-line utility for running arbitrary commands when any modifications occur in a given directory.
“entr” stands for Event Notify Test Runner. This tool was created with the goal of making rapid feedback and automated testing.
entr is pre-installed in the Linux distribution. In case it’s missing, you need to install it manually.
This tool is simple to use and can be installed with the following command.
sudo apt-get install entr
Or you can also install it by cloning the official Git repository.
git clone https://github.com/eradman/entr.git
Next, navigate to that directory and install the requirements using the below commands.
./configure make test make install
To see available build options run
Sample Example Commands
To see the options and arguments available for
entr command. Use the following command.
This command displays the user manual for the
NAME entr — run arbitrary commands when files change SYNOPSIS entr [-acdnprsz] utility [argument /_ ...] DESCRIPTION A list of files provided on standard input, and the utility is executed using the supplied arguments if any of them change. entr waits for the child process to finish before responding to subsequent file system events. A TTY is also opened before entering the watch loop in order to support interac‐ tive utilities. The arguments are as follows: -a Respond to all events which occur while the utility is running. Without this option, entr consolidates events in order to avoid looping. This option has no effect in conjunction with the -r flag. -c Clear the screen before invoking the utility specified on the command line. Specify twice to erase the scroll back buffer. -d Track the directories of regular files provided as input and exit if a new file is added. This option also enables directories to be specified explicitly. If specified twice, all new entries to a directory are recognized, otherwise files with names beginning with ‘.’ are ig‐ nored. -n Run in non-interactive mode. In this mode entr does not attempt to read from the TTY or change its properties. -p Postpone the first execution of the utility until a file is modified. Manual page entr(1) line 1 (press h for help or q to quit)
entrreloads the MySQL server.
ls *.js | entr -r mysql
- To Auto-reload a web server or terminate if the server exits.
$ ls * | entr -rz ./httpd
For more details and examples on
entr command, you can visit their official GitHub repository.
Final Words 👩💻
I hope you found this article very useful in learning how to run Linux commands when any file in a given directory changes and when new files are created.
You may also be interested in learning how to remove files and directories in Linux.