4

In osx I am trying to detect when a new file is added to a folder, then execute a script to process that new file. Seems simple, right?

I am doing this:

fswatch  -0  ~/motion-detection | xargs -0 -n1 -I {} ./detectmotion.sh

which will call the shell script detectmotion.sh which consists of:

echo "File added: " $1

for now, at least. I just want to pass the filename of the changed file to detectmotion.sh

I get a blank for $1

Can anyone see what I am doing wrong here?

Thanks in advance!

Uberbug
  • 97
  • 9

1 Answers1

4

It is expected to be empty because you are not passing the argument to the script detectmotion.sh which you got from xargs. It should have been

fswatch  -0  ~/motion-detection | xargs -0 -n1 -I {} ./detectmotion.sh "{}"

Remember that the -I {} flag in xargs represents a place-holder for the value pipe-lined to xargs. So in your attempt as part of the question, you are just storing the value in the place-holder({}) and not actually passing it to the script to make it useful.

So I modified the command so that you are actually passing the received value to the script which can now be printed when accessed as $1 inside the script.

Quoting from the man xargs page for -I

-I replace-str
     Replace  occurrences  of  replace-str  in the initial-arguments with names read from 
     standard input.  Also, unquoted blanks do not terminate input items; instead the 
     separator is the newline character.  Implies -x and -L 1.

In our case the replace-str being used as {}.

Inian
  • 80,270
  • 14
  • 142
  • 161