A 디렉터리에 확장자가 "*.f90"인 파일이 여러 개 있습니다. 쉘 스크립트의 각 파일에 다음 명령을 적용하고 싶습니다. 예를 들어 파일 이름.f90
f2py -h filename.pyf -m filename /path/to/directory-A/filename.f90
그러면 디렉터리 B에 저장하려는 ".pyf" 파일이 생성됩니다.
다음 스크립트를 사용하고 있습니다.
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