매우 간단한 스크립트가 있습니다. 나는 다음과 같이 개별 디렉토리에 CD를 넣고 싶습니다.
cd PKA1/timestep_size/v_0.001/250eV
../ovitos silica_defects.py
PKA1에서 PKA24까지 1씩 반복하고 싶습니다. 어떻게 해야 합니까? 또한, 각 하위 폴더(250eV 하위 폴더)에 실리카_defects.py를 복사하는 대신, 각 디렉터리에 실리카_defects.py를 적용하고 거기에 파일을 출력하도록 하는 방법이 있습니까?
답변1
bash
버팀대 확장 작업은 다음과 같습니다 {START..END}
.
PKA{1..24}
그래서 당신은 이것을 할 수 있습니다 :
for f in PKA{1..24}/timestep_size/v_0.001/250eV/; do ...; done
의 경우 silica_defects.py
파일의 절대 경로를 사용합니다.
답변2
for 루프를 사용하여 1부터 24까지의 정수를 생성하고 cd
서브셸을 사용하여 디렉터리를 하위 디렉터리로 변경한 다음 스크립트를 실행해 보겠습니다.
for (( i = 1; i <= 24; ++i )); do
( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done
cd
하위 쉘을 사용하면 다음 하위 디렉토리를 사용하기 전에 이전 디렉토리로 "다시 변경"할 필요가 없습니다. 를 사용하면 &&
어떤 이유로 디렉토리가 존재하지 않을 때 프로그램 실행을 피할 수도 있습니다.
분명히 당신도 할 수 있습니다
for i in {1..24}; do
( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done
{start..end}
...하지만 저는 미학적 이유로 이 구문을 좋아하지 않으며 루프를 더 유연하게 수행할 수 있는 기회도 제공하지 않습니다(다른 경우에는).
답변3
문제는 무엇입니까:
for ((i=1;i<=24;i++)) ; do
cd PKA${i}/timestep_size/v_0.001/250eV
../ovitos silica_defects.py
cd $OLDPWD
done