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


15

하자 내가, 일부 하위 디렉토리가있는 디렉토리하다고 말하고 dir1, dir2하고 dir3. 이러한 각 디렉토리에는 파일이 있으며 각 디렉토리 foo에서 동일한 명령을 실행하고 foo해당 디렉토리 내에서 해당 명령 을 실행하고 싶습니다 .

내가 "손으로"해야한다면 다음과 같이 보일 것입니다.

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

각 디렉토리에서 명령을 실행해야합니다 . foo배치 스케쥴 스크립트 (알고 싶은 경우 HTCondor)이며, 스케쥴링 스크립트에 의해 시작된 런의 출력이 각 서브 디렉토리에서 끝나도록 각 서브 디렉토리에서 실행되어야합니다.

질문은 " 파일을 찾아 파일의 디렉토리에서 명령을 실행 "지금까지 내가 말할 수있는, 내 질문에 대답하지 않습니다. 그 질문에 대한 첫 번째 대답은 내 경우에는 효과가없는 해결 방법에 대한 것이고, 두 번째 대답에는 사용법을 알 수있는 설명이 충분하지 않습니다.


@roaima, 중복 방법을 설명해주세요. 그 질문의 첫 번째 대답은 나에게 도움 이 되지 않으며 , 해결 방법이 많으며 두 번째 대답은 나에게 의미가 없습니다. 사용법을 알기 위해서는 더 많은 설명이 필요합니다.
NeutronStar

답변:


23

find지원 한다고 가정 하고 -execdir대신 옵션을 사용하십시오.-exec

find * -name 'foo' -execdir pwd \;

그렇지 않은 경우 플랫폼 및 / 또는 배포에 대한 세부 정보를 제공하십시오 (적절한 경우).


"찾기 : 상대 경로 './node_modules/.bin'이 PATH 환경 변수에 포함됩니다" askubuntu.com/questions/621132/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

내가 그렇게 쓸 수 있다면 미안하지만 우분투의 -execdir은 똥 {}입니다 {}.
uav

1
@uav 사용 사례를 모른 채 도움을 드릴 수 없습니다. 그러나 사용자의 응답에 따라 설명서에는 " 좋아요 -exec, 그러나 지정된 명령이 일치하는 파일이 포함 된 하위 디렉토리에서 실행됩니다 "라고 명확하게 표시되어 있습니다 .
roaima

그렇습니다. -type d (= directory)를 찾고 최적이 아닌 경우 특별한 경우입니다.
uav

당신의 유스 케이스를 알지 못하면 나는 당신을 도울 수 없습니다.
roaima

4

명령을 실행할 디렉토리를 정확히 알고 있다고 가정하면,

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 ';'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.