-1

Why does running this command give me error message: No such file or directory ?

for i in `find ~/desktop -name '*.py'` ; do ./$i ;  done
User007
  • 19
  • 4

4 Answers4

1

The complete error message makes it much more clear what the problem is:

bash: .//home/youruser/desktop/foo.py: No such file or directory

You can see that there is indeed no such file:

$ .//home/youruser/desktop/foo.py
bash: .//home/youruser/desktop/foo.py: No such file or directory

$ ls -l .//home/youruser/desktop/foo.py
ls: cannot access './/home/youruser/desktop/foo.py': No such file or directory

Here's instead how you can run a file /home/youruser/desktop/foo.py:

$ /home/youruser/desktop/foo.py
Hello World

So to run it in your loop, you can do:

for i in `find ~/desktop -name '*.py'` ; do $i ;  done

Here's a better way of doing the same thing:

find ~/desktop -name '*.py' -exec {} \;

or with a shell loop:

find ~/desktop -name '*.py' -print0 | while IFS= read -d '' -r file; do "$file"; done

For an explanation of what ./ is and does, and why it makes no sense here, see this question

that other guy
  • 116,971
  • 11
  • 170
  • 194
0

Try find and exec option. http://man7.org/linux/man-pages/man1/find.1.html

   -exec command ;
          Execute command; true if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command
          until an argument consisting of `;' is encountered.  The
          string `{}' is replaced by the current file name being
          processed everywhere it occurs in the arguments to the
          command, not just in arguments where it is alone, as in some
          versions of find.  Both of these constructions might need to
          be escaped (with a `\') or quoted to protect them from
          expansion by the shell.  See the EXAMPLES section for examples
          of the use of the -exec option.  The specified command is run
          once for each matched file.  The command is executed in the
          starting directory.  There are unavoidable security problems
          surrounding use of the -exec action; you should use the
          -execdir option instead.

   -exec command {} +
          This variant of the -exec action runs the specified command on
          the selected files, but the command line is built by appending
          each selected file name at the end; the total number of
          invocations of the command will be much less than the number
          of matched files.  The command line is built in much the same
          way that xargs builds its command lines.  Only one instance of
          `{}' is allowed within the command, and (when find is being
          invoked from a shell) it should be quoted (for example, '{}')
          to protect it from interpretation by shells.  The command is
          executed in the starting directory.  If any invocation with
          the `+' form returns a non-zero value as exit status, then
          find returns a non-zero exit status.  If find encounters an
          error, this can sometimes cause an immediate exit, so some
          pending commands may not be run at all.  This variant of -exec
          always returns true.
lennhv
  • 103
  • 6
0

The paths returned by the find statement will be absolute paths, like ~/desktop/program.py. If you put ./ in front of them, you get paths like ./~/desktop/ which don’t exist.

Replace ./$i with "$i" (the quotes to take care of file names with spaces etc.).

Jim Danner
  • 535
  • 2
  • 13
0

You should use $i and not ./$i

I was doing the same thing this exact moment. I wanted a script to find if there's any flac files in the directory and convert it to opus.

Here is my solution:

if test -n "$(find ./ -maxdepth 1 -name '*.flac' -print -quit)"
then
    do this
else
    do nothing
fi