我在目录 A 中有几个扩展名为“*.f90”的文件。我想对 shell 脚本中的每个文件应用以下命令。例如文件名.f90
f2py -h filename.pyf -m filename /path/to/directory-A/filename.f90
这将生成一个“.pyf”文件,我想将其存储在目录-B 中。
我正在使用以下脚本。
find "/path/to/directory-A/" -name "*.f90" -exec f2py -h {}.pyf -m {} {}.f90\;
这使用 find 函数的输出并将其替换为 -exec 命令中的“{}”。这意味着我的代码中“{}”的每个位置都将替换为“filename.f90”。因为我只想将文件名(即不带扩展名)放在 exec 命令中代替“{}”
我尝试使用 basename 命令,它仅提供文件名,但原始执行命令中的“{}”仍然包含扩展名。我使用了以下代码。
find "/path/to/directory-A/" -name "*.f90" -exec basename\ {} \ .f90; -exec f2py -h {}.pyf -m {} {}.f90\;
我该如何解决这个问题。另外,我想在目录 B 中执行命令,以便在目录 B 中创建“.pyf”文件。我该怎么做呢?
答案1
使用我最喜欢的一句台词:
cd directory-A
for i in *p90; do f2py -h ${i%.p90}.pyf -m ${i%.p90} $i; mv ${i%.p90}.pyf directory-B; done
你必须明白,“扩展名”只是类 UNIX 操作系统中文件名的一个奇怪的部分,没有特殊处理。
如果文件名中存在空格或其他奇怪的符号,您可能需要在一行中修改引号。
答案2
find "/path/to/directory-A/" -name "*.f90" -exec /path/to/callf2py {} \;
调用f2py:
#!/bin/sh
f=$(basename $1)
f2py -h $f.pyf -m $f.f90