`find -exec`를 사용하여 발견 된 파일의 디렉토리 (현재 디렉토리가 아닌)에서 명령을 실행하는 방법은 무엇입니까? foo) cd ../dir3 (execute on foo) 각 디렉토리에서

하자 내가, 일부 하위 디렉토리가있는 디렉토리하다고 말하고 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.

비표준을 사용하는 솔루션 -execdirroaima ‘s answer를 참조하십시오 . 그의 대답은 나의 모범에 적응했다 :

find . -type f -name foo -execdir somecommand foo ';'


답변