0

I have several files with extensions "*.f90" in directory-A. I want to apply the following command for each file in shell script. e.g. filename.f90

f2py -h filename.pyf -m filename /path/to/directory-A/filename.f90

This will generate a ".pyf" file that I want to store in directory-B.

I am using the following script.

find "/path/to/directory-A/" -name "*.f90" -exec f2py -h {}.pyf -m {} {}.f90\;

This uses the output of find function and replaces it in the -exec command in place of "{}". which means that every where in place of "{}" my code will replace it with "filename.f90". where as I want only the file name i.e. without extension to be placed in exec command in place of "{}"

I tried using the basename command, it works in giving the filename only but "{}" in my original execute command still contains the the extension. I used following code.

find "/path/to/directory-A/" -name "*.f90" -exec basename\ {} \ .f90; -exec f2py -h {}.pyf -m {} {}.f90\;

How do I fix this issue. Also I want to execute my command in directory-B, so that the ".pyf" files are created in directory-B. how do I do this?

  • 1
    consider a wrapper script between find and f2py that executes basename and then passes the two different parameters to f2py – Jeff Schaller Jun 7 '15 at 20:57
  • @JeffSchaller I don't know how I would do that? Can you help me. – Syed Moez Jun 7 '15 at 21:12
1

Use my favorite one-liner:

cd directory-A
for i in *p90; do f2py -h ${i%.p90}.pyf -m ${i%.p90} $i; mv ${i%.p90}.pyf directory-B; done

You have to understand that the "extension" is just a weird part of a file name in unix-like OSes and has no special treatment.

You may need to fiddle with quotes in the one-liner if there are spaces or other weird symbols in file names.

  • 1
    I like the % use; just note that the glob expansion will not catch any subdirectories, like find will. Not that there's a good answer to the question in the title -- thus all these workarounds. – Jeff Schaller Jun 8 '15 at 1:54
  • You didn't mention any subdirectories in the question and it is unclear how the f2py command handles filenames, whether they can be with full path or not, so I went by the example. In case of subdirectories you will need some kind of postprocessing, either by feeding the data to a wrapper as suggested above or feeding them o another one-liner like mine: find -name *p90 | while read a; do ...some-clever-postprocessing...; f2py ...; done. Did I get it right this time? If so let me know so that I can update the answer. – mikky Jun 8 '15 at 10:47
  • It's not my question; I just wanted to point out that the question uses find, which recurses. – Jeff Schaller Jun 8 '15 at 10:59
  • Oh, I see, sorry about that, I was on the phone and assumed, prematurely obviously. – mikky Jun 8 '15 at 11:28
1
find "/path/to/directory-A/" -name "*.f90" -exec /path/to/callf2py {} \;

callf2py:

#!/bin/sh
f=$(basename $1)
f2py -h $f.pyf -m $f.f90
  • Sorry for the formatting; I'm on a mobile device. – Jeff Schaller Jun 7 '15 at 22:07
  • Thanks. At "f=$(basename $1)" I get error saying permission denied. I have created a new shell script with this code and I am calling this code callf2py from the original code. Permission for all the files are okay. – Syed Moez Jun 7 '15 at 22:26
  • post your command, the script you created, and the output. the answer works fine for me. – Jeff Schaller Jun 8 '15 at 0:56
  • I have created a shell script callf2py.sh which has the following code: #!/bin/sh f= $(basename $1) f2py -h $f.pyf -m $f $f.f90 In my main script I am using following: find "$main_dir/source_code/3DBGB/" . -name '*.f90' -exec $main_dir/callf2py.sh {} \; – Syed Moez Jun 8 '15 at 16:34
  • 1
    it's hard to tell from your unformatted comment; can you show a sample run with the error? you might have an extra space between f= and $(basename $1) – Jeff Schaller Jun 9 '15 at 0:11

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.