나는 -exec
find 명령의 플래그를 가지고 놀고 있습니다. 나는 상당히 새로운 Linux 배포판을 사용하여 파일 확장자를 인쇄하기 위해 이 플래그를 사용하려고 합니다.
간단하게 시작하면 다음과 같이 작동합니다.
find . -type f -exec echo {} \;
편리한 Bash 문자열 함수를 사용하려는 시도가 실패했습니다.
find . -type f -exec echo "${{}##*.}" \; (bad substitution)
그렇다면 올바른 접근 방식은 무엇입니까?
답변1
쉘 매개변수 확장을 사용하려면 다음을 사용하여 일부 쉘을 실행하십시오 exec
.
find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
답변2
find . -type f | while read file; do echo "${file##*.}"; done
누구도 기억할 수 없는 까다로운 exec 구문을 모두 우회할 수 있다는 장점이 있습니다.
또한 발견된 각 파일에 대해 하나의 하위 프로세스를 생성하고 삭제하는 대신 하나의 하위 프로세스만 생성할 수 있다는 이점도 있습니다. 이것은 exec를 사용하는 jimmij 버전보다 훨씬 빠릅니다.
# Preparation - 1000 files
for i in {1..1000}; do touch $i.$i; done
>time find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
real 0m21.906s
user 0m6.013s
sys 0m12.304s
>time find . -type f | while read file; do echo "${file##*.}"; done
real 0m0.219s
user 0m0.125s
sys 0m0.087s