내가 실행하는 경우 find
에 -execdir
나는 내가 기대 한 결과를 얻을 수 없습니다.
예를 들면 다음과 같습니다.
mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
│ ├── c
│ └── foo
└── foo
디렉토리 c
에 foo
파일 이 없습니다 . find
각 디렉토리에서 로컬로 무언가를 방문하고 어떻게해야 합니까?
내가 실행하는 경우 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'\')
man bash
"-c"아래 상태 : command_string 뒤의 인수는 $ 0으로 시작하는 위치 매개 변수에 지정되지만 "for d"는 $ 1로 시작하는 위치 매개 변수를 반복합니다. "_"는 $ 0에 할당 된 텍스트이며 사용되지 않습니다.