내가 실행하는 경우 find
에 -execdir
나는 내가 기대 한 결과를 얻을 수 없습니다.
예를 들면 다음과 같습니다.
mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
│ ├── c
│ └── foo
└── foo
디렉토리 c
에 foo
파일 이 없습니다 . 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
일치하는 디렉토리 c
는 b
디렉토리에 있으므로 exec가 실행되는 디렉토리입니다. 디렉토리 대신 파일을 찾고 있다면 예상대로 작동합니다.
xargs
전체 디렉토리 목록이 제공되므로 디렉토리를 보내서 원하는 것을 얻을 수 있습니다 .