Shell脚本:使用“find”执行shell命令,该命令包含从“find”返回的“文件名”(不带扩展名)

Shell脚本:使用“find”执行shell命令,该命令包含从“find”返回的“文件名”(不带扩展名)

我在目录 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

相关内容