쉘 스크립트를 여러 대상 디렉토리에 복사하고 실행하십시오.

쉘 스크립트를 여러 대상 디렉토리에 복사하고 실행하십시오.

C201201A/RA/, C201202A/RB 등과 같은 여러 디렉터리와 하위 디렉터리가 있습니다. 그래서 setphase.sh를 모든 하위 디렉터리에 복사하고 실행하고 싶습니다. 나는 다음 코드를 시도했다

#!/bin/bash
ls -d */*/ > folders.txt
no=1
while read folder
    do echo $folder
       cp setphase.sh $folder
       sh setphase.sh
       no=`expr $no + 1`
done < folders.txt

어디에 써야 하나요 sh setphase.sh?

답변1

스크립트가 실제로 디렉토리에 있을 필요가 없다면(매우 소수의 스크립트가 있고...있는 스크립트는 거의 확실하게 잘못 작성되어 수정이 필요함) 옵션을 사용하여 find-execdir디렉토리에서 스크립트를 실행할 수 있습니다. 예를 들어:

find . -mindepth 2 -maxdepth 2 -type d -execdir /path/to/setphase.sh \;

GNU find매뉴얼 페이지에서:

-execdir command ;

-execdir command {} +

와 유사 -exec하지만 지정된 명령은 일반적으로 시작한 디렉터리가 아닌 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다 find.

이는 일치하는 파일에 대한 경로를 구문 분석하는 동안 경쟁 조건을 방지하므로 명령을 호출하는 더 안전한 방법입니다.

-exec작업 과 마찬가지로 +양식은 -execdir일치하는 여러 파일을 처리하는 명령줄을 작성하지만 지정된 명령 호출은 동일한 하위 디렉터리에 존재하는 파일만 나열합니다.

이 옵션을 사용하는 경우 $PATH환경 변수가 참조되지 않도록 해야 합니다 .. 그렇지 않으면 공격자가 실행할 디렉터리에 적절한 이름의 파일을 남겨두어 원하는 명령을 실행할 수 있습니다 -execdir.

$PATH의 항목이 비어 있거나 절대 디렉터리 이름이 아닌 경우에도 마찬가지입니다. 호출이 종료 상태로 0이 아닌 값을 반환하는 경우 find 0이 아닌 종료 상태가 반환됩니다. 오류가 발생 하면 find즉시 종료되는 경우가 있으므로 보류 중인 일부 명령이 전혀 실행되지 않을 수도 있습니다.

작업 결과는 작업이 사용되는지 아니면 변형이 사용되는지에 따라 달라집니다 +. true는 항상 반환되지만 명령이 0을 반환하는 경우에만 true입니다.;-execdir command {} +-execdir command {} ;

답변2

C2012A/모든 하위 디렉터리가 디렉터리 내에 있는 경우 cp스크립트를 하위 디렉터리에 복사하고 for다음과 같은 구조를 사용하여 실행할 수 있습니다.

for d in C2012A/*/; do
    cp setphase.sh "$d"
    sh "$d"/setphase.sh
done

스크립트는 실행 위치에 의존하지 않는 것으로 가정됩니다.

또한 를 실행하면 스크립트에 있는 경우 shebang이 무엇인지에 관계없이 sh setphase.sh스크립트 실행을 인수 (시스템에 따라 , 또는 다른 것일 sh수 있음 )로 명시적으로 언급한다는 점에 유의하십시오.dashbash


하위 디렉터리가 다른 디렉터리에 있는 경우:

for d in C2012A/*/ A1812A/*/ B8012B/*/; do
    cp setphase.sh "$d"
    sh "$d"/setphase.sh
done

요구 사항에 맞게 디렉터리 이름을 바꾸십시오.

관련 정보