2

I have a process that creates many files in a known directory, and the only way to tell how far along it is is to type ls manually. Is there a way to make the output of ls update automatically as new files are created, similar to how tail -f works? Because of their names, every new file appears at the end of the list, so I wouldn't have to worry about them appearing in the middle.

  • Is the program that creates the files something that instead could possibly be updated to output how far it has come, alternatively how far it has left to go? If not, a tool that is often used to detect file modifications/creation is inotify. – Kusalananda Jan 11 at 7:25
  • In this specific instance, yes. However I've bumped into this problem in cases where I could not edit the program, and because I couldn't find an answer to this problem on the internet. I figured it would be a useful trick to know, and may help someone else out if there is a solution. – David Scott Jan 11 at 7:28
  • Also, doing this without editing the program does not restrict you to receiving the output in the launch terminal, and can be turned on and off. – David Scott Jan 11 at 7:29
10

You can use command like:

watch ls

to loop execution of ls command

If the listing is too long you can add -C to ls

watch ls -C

Or you can create explicit loop with while

while [ 1 ]
 do
  clear
  ls
  sleep 60
done
  • 1
    Marked this as the answer for being the closest to my intentions, with the added benefit of allowing for the multi-column output of ls. – David Scott Jan 11 at 7:54
  • 1
    I turned this into a one-line terminal command to make it into an alias more easily: while [ 1 ]; do clear; ls; sleep 60; done – David Scott Jan 11 at 7:55
  • @DavidScott, sure, that's possible, feel free to tune the code according to your environment and requirements – Romeo Ninov Jan 11 at 7:57
  • 2
    Since you want to watch a progress, something like watch 'ls -ltr | tail' may suit best. Note the quotes so that the shell does not interpret the |. – rexkogitans Jan 11 at 14:06
8

You can use a script like this that monitor every changes and after any change it makes a ls sorted by date. To be able to execute it you would need inotify-tools installed. The script would be the following:

#!/bin/bash
DIRECTORY="your_directory_path"
inotifywait -m -r -e create --format '%w%f' "${DIRECTORY}" | while read NEW
do
        ls -hltr
done
  • I like this answer because it doesn't "poll" and update every X seconds. Instead, it will trigger a refresh when there is a reason to refresh. Presumably, it will react more quickly than sleep 60 will allow. – Christopher Schultz Jan 11 at 18:09

Your Answer

By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.