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
수 있음 )로 명시적으로 언급한다는 점에 유의하십시오.dash
bash
하위 디렉터리가 다른 디렉터리에 있는 경우:
for d in C2012A/*/ A1812A/*/ B8012B/*/; do
cp setphase.sh "$d"
sh "$d"/setphase.sh
done
요구 사항에 맞게 디렉터리 이름을 바꾸십시오.