[unix] -execdir로 찾기

내가 실행하는 경우 find-execdir나는 내가 기대 한 결과를 얻을 수 없습니다.

예를 들면 다음과 같습니다.

mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
   ├── c
   └── foo
└── foo

디렉토리 cfoo파일 이 없습니다 . find각 디렉토리에서 로컬로 무언가를 방문하고 어떻게해야 합니까?



답변

일치하는 모든 파일 (즉, 모든 디렉토리)에 대해 파일 find이 포함 된 디렉토리 (예 : 상위 디렉토리)로 전환하고 지정된 명령을 실행합니다. 명령은 일치하는 이름을 사용하지 않으므로 모든 디렉토리에서 작동하지 않습니다. 이 특정 디렉토리 트리의 경우

(cd . && touch foo)        # because ./a matches
(cd ./a && touch foo)      # because ./a/b matches
(cd ./a/b && touch foo)    # because ./a/b/c matches

모든 디렉토리에있는 파일을 만들려면, 당신은 간단하게 사용할 수있는 -exec대신 -execdir의 구현 제공 find할 수 있습니다 {}인수 내부 (대부분, 특히 나는 모든 사람을 생각)

find . -type d -exec touch {}/foo +

POSIX 이식성을 위해서는 디렉토리 이름과 파일베이스 이름을 수동으로 조립해야합니다.

find . -type d -exec sh -c 'touch "$0/foo"' {} \;

또는 (약간 빠름)

find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +

또는 bash의 재귀 와일드 카드 일치를 사용할 수 있습니다. ksh 및 zsh의 해당 기능과 달리 find명령 과 달리 bash는 디렉토리에 대한 심볼릭 링크 아래에서 반복됩니다.

shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done

zsh 솔루션 :

touch ./**/(e\''REPLY+=foo'\')


답변

명령은 일치하는 파일이 포함 된 모든 디렉토리에서 실행됩니다. 이후c디렉토리를 포함하지 않기 디렉토리가 일치하지 않으므로 디렉토리에서 실행되지 않습니다.

해결책은 다음과 같이 디렉토리 이름을 execdir 인수에 추가하는 것입니다.

find . -type d -execdir touch {}/foo \;


답변

에서 man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

일치하는 디렉토리 cb디렉토리에 있으므로 exec가 실행되는 디렉토리입니다. 디렉토리 대신 파일을 찾고 있다면 예상대로 작동합니다.

xargs전체 디렉토리 목록이 제공되므로 디렉토리를 보내서 원하는 것을 얻을 수 있습니다 .


답변