나는 다음과 같은 구조를 가지고 있습니다 :
Father:
├───Charlie
│ └───lang.log
├───Ava
│ └───lang.log
├───Sophia
│ └───lang.log
...
계획을 정리하고 싶습니다. 나는 시도한다:
cat /dev/null > Father/*/lang.log
하지만 다음 오류가 발생했습니다.
-bash: */lang.log: 모호한 리디렉션
동시에 모든 파일을 비울 수 있는 방법은 무엇입니까? 아마도 단일 명령으로 가능합니다.
답변1
POSIX 솔루션, 기본:
find Father/ -type f -name lang.log -exec sh -c 'true > "$1"' sh {} \;
… -exec true > {} \;
작동하지 않습니다. 내부 쉘이 필요합니다.리디렉션 때문에. 쉘 부분은 가 아닙니다 sh -c 'true > {}'
. 이 버전은결함이 있는.
sh
POSIX 솔루션은 일치하는 파일이 많을 경우 더 적은 프로세스를 생성하므로 속도가 더 빨라집니다 .
find Father/ -type f -name lang.log -exec sh -c 'for f; do true > "$f"; done' sh {} +
truncate
많은 피연산자를 사용할 수 있는 경우 ( truncate
POSIX에서는 필요하지 않음):
find Father/ -type f -name lang.log -exec truncate -s 0 -- {} +
--
이 특별한 경우에는 에서 오는 모든 경로가 find
로 시작해야 하고 Father/
옵션으로 위장할 위험이 없기 때문에 여기서는 과도합니다. 그러나 일반적으로 --
즉석에서 생성된 이전 피연산자를 사용하는 것이 좋습니다.
답변2
이를 수행하는 방법은 다음을 사용하는 것입니다 xargs
.
find . -name lang.log | xargs -I {} sh -c "cat /dev/null > {}"
해당 이름을 가진 모든 파일을 찾은 다음 각각에 대해 실행합니다 cat /dev/null > <filename>
.