Shell Script: Use “find” para executar shell um comando que contenha “filename” (sem extensão) retornado de “find”

0

Eu tenho vários arquivos com extensões "* .f90" no diretório-A. Eu quero aplicar o seguinte comando para cada arquivo no script de shell. por exemplo. filename.f90

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

Isso gerará um arquivo ".pyf" que eu quero armazenar no diretório B.

Estou usando o seguinte script.

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

Isso usa a saída da função find e a substitui no comando -exec no lugar de "{}". o que significa que todo lugar no lugar de "{}" meu código irá substituí-lo por "filename.f90". onde como eu quero apenas o nome do arquivo, ou seja, sem extensão para ser colocado no comando exec no lugar de "{}"

Eu tentei usar o comando basename, ele funciona dando apenas o nome do arquivo, mas "{}" no meu comando de execução original ainda contém a extensão. Eu usei o seguinte código.

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

Como corrijo esse problema. Também quero executar meu comando no diretório-B, para que os arquivos ".pyf" sejam criados no diretório-B. como faço isso?

    
por Syed Moez 07.06.2015 / 22:49

2 respostas

1

Use o meu favorito 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

Você tem que entender que a "extensão" é apenas uma parte estranha de um nome de arquivo em sistemas operacionais unix-like e não tem nenhum tratamento especial.

Você pode precisar mexer com aspas no one-liner se houver espaços ou outros símbolos estranhos em nomes de arquivos.

    
por 08.06.2015 / 03:05
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
    
por 08.06.2015 / 00:07