하자 내가, 일부 하위 디렉토리가있는 디렉토리하다고 말하고 dir1
, dir2
하고 dir3
. 이러한 각 디렉토리에는 파일이 있으며 각 디렉토리 foo
에서 동일한 명령을 실행하고 foo
해당 디렉토리 내에서 해당 명령 을 실행하고 싶습니다 .
내가 “손으로”해야한다면 다음과 같이 보일 것입니다.
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
각 디렉토리에서 명령을 실행해야합니다 . foo
배치 스케쥴 스크립트 (알고 싶은 경우 HTCondor)이며, 스케쥴링 스크립트에 의해 시작된 런의 출력이 각 서브 디렉토리에서 끝나도록 각 서브 디렉토리에서 실행되어야합니다.
질문은 ” 파일을 찾아 파일의 디렉토리에서 명령을 실행 “지금까지 내가 말할 수있는, 내 질문에 대답하지 않습니다. 그 질문에 대한 첫 번째 대답은 내 경우에는 효과가없는 해결 방법에 대한 것이고, 두 번째 대답에는 사용법을 알 수있는 설명이 충분하지 않습니다.
답변
find
지원 한다고 가정 하고 -execdir
대신 옵션을 사용하십시오.-exec
find * -name 'foo' -execdir pwd \;
그렇지 않은 경우 플랫폼 및 / 또는 배포에 대한 세부 정보를 제공하십시오 (적절한 경우).
답변
명령을 실행할 디렉토리를 정확히 알고 있다고 가정하면,
for dir in dir1 dir2 dir3; do
( cd "$dir" && somecommand foo )
done
또는 foo
파일을 반복하면서
for foo in */foo; do
( cd "${foo%/*}" && somecommand foo )
done
서브 쉘 cd
은 나머지 스크립트의 작업 디렉토리에 영향을주지 않습니다. ${foo%/*}
하여 디렉토리의 이름에 매개 변수 대체가 확장 foo
(지난 후 모든 것을 제거하여 파일이 삶 /
의 가치 $foo
).
표준 find
을 사용 하여 동일한 작업을 수행합니다 ( foo
파일이 디렉토리 구조에서 깊게 존재할 수 있는 경우 ).
find . -type f -name foo -exec sh -c '
for foo do
( cd "${foo%/*}" && somecommand foo )
done' sh {} +
한마디로 : 현재 디렉토리 나 그 아래에서 “foo”라는 모든 일반 파일을 찾고이 쉘 스크립트의 경로 이름을 일괄 적으로 지정하십시오. 쉘 스크립트는 주어진 경로명을 반복하고, 디렉토리를 각 경로명의 디렉토리 부분으로 변경하고, 성공하면 실행한다 somecommand foo
.
비표준을 사용하는 솔루션 -execdir
은 roaima ‘s answer를 참조하십시오 . 그의 대답은 나의 모범에 적응했다 :
find . -type f -name foo -execdir somecommand foo ';'