다양한 깊이의 하위 폴더가 있는 디렉토리가 있습니다. 모든 항목을 반복하여 특정 이름의 폴더가 포함되어 있는지 확인하고 해당 디렉터리가 존재하면 스크립트를 실행하고 싶습니다( foo.sh
혼란을 피하기 위해 이 스크립트를 호출하겠습니다 ).
foo.sh
대상 폴더가 발견되면 현재 폴더에서 실행되어야 합니다. 예:
/A
/subA-1
/subA-2
/target
/subA-3
/sub-subA-3
/target
내가 찾고 있는 명령/스크립트는 에서 실행되어야 하며 /A
그런 다음 이름이 지정된 폴더를 찾는 모든 하위 폴더를 반복합니다 target
. 일단 입력되면 /subA-2
이 조건이 충족되고 /subA-2
foo.sh 가 실행됩니다. 동일 /sub-subA-3
하지만 그렇지 않습니다 /subA-3
.
foo.sh
입력이 필요하지 않으며 포함만 하면 됩니다 /target
.
답변1
그것은 간단합니다:
find A -type d -name target -execdir foo.sh \;
매뉴얼 페이지에서:
-execdir 명령;
-exec와 비슷하지만 지정된 명령은 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다.
예:
문제에 따라 디렉터리 구조를 만들고 인쇄합니다.
/tmp$ mkdir A; cd A
/tmp/A$ mkdir -p subA-1 subA-2/target subA-3/sub-subA-3/target
/tmp/A$ find .
.
./subA-2
./subA-2/target
./subA-3
./subA-3/sub-subA-3
./subA-3/sub-subA-3/target
./subA-1
이제 명령을 실행하여 무슨 일이 일어나는지 pwd
보여 줍니다 foo.sh
.
/tmp/A$ find . -type d -name target -execdir pwd \;
/tmp/A/subA-2
/tmp/A/subA-3/sub-subA-3
답변2
zsh 사용:
cd /A && for dir (**/target(/N:h) (cd -- $dir && foo.sh)
답변3
가장 쉬운 방법은 모든 디렉터리 찾기를 사용한 find
다음 스크립트를 수정하여 foobar
올바른 이름의 디렉터리가 있는지 확인하는 것입니다(예:).
#!/bin/bash
targetDir="$@" ## The directory to run the script on
dirName="target" ## Change this to whatever the "target" is
cd "$trargetDir"
## Exit if the $targetDir doesn't have a directory with
## the name you're looking for
[ -d "$targetDir"/"$dirName" ] || exit
## If it does, cd into the $targetDir and continue the script
cd "$targetDir"
### The rest of the script goes here
...
이제 명령을 실행 find
하고 발견된 모든 디렉터리에서 스크립트를 실행하도록 할 수 있습니다.
find /target -type d -exec /path/to/script.sh "{}" \;
모든 작업을 수행할 수도 있지만 find
개인적으로 위의 솔루션이 더 깨끗하다고 생각합니다. 그러나 그것은 당신에게 달려 있습니다. 한 가지 방법은 다음과 같습니다.
pwd="$PWD"; find . -type d -name foobar -printf '%h\0' |
while IFS= read -d '' dir; do cd "$dir" && foo.sh; cd "$pwd"; done
답변4
찾기 명령을 사용하십시오.
사람들이 발견했습니다몇 가지 예가 있습니다.
find /tmp -name core -type f -print | xargs /bin/rm -f
find . -type f -exec file '{}' \;