bash 오류 찾기: -printf: 알 수 없는 기본 또는 연산자

bash 오류 찾기: -printf: 알 수 없는 기본 또는 연산자

내 컴퓨터에 있는 모든 파일을 나열했습니다.

FILES=$(find . -type f -name '*' -printf "%s/%f\n" | sort -n)

출력은 다음과 같아야 합니다.

"size/file_name"
56872/file.txt
98566/test
1000254/foo

컴퓨터에서 오류가 발생합니다.

find: -printf: unknown primary or operator

해결책이 있나요?

답변1

-printf옵션을 사용할 수 없습니다.POSIX find. 이것이 GNU의 특징이다find, 예를 들어 Linux의 경우.

사용 중인 특정 구현은 표시되지 않습니다. 아마도 확장이 없는 POSIX일 것입니다. 예를 들어, 그렇지 않습니다.FreeBSD, 또는OSX.

없는 경우 다음과 같은 몇 가지 대안을 사용할 수 있습니다(포함된 공백 등을 처리하지 않지만 도구에 대해 거의 가정하지 않음).

find . -type f -exec ls -ld {} \; | awk '{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }'

사용 가능한 도구에 대한 추가 정보를 통해 (일반적으로) 솔루션을 개선할 수 있습니다.

답변2

find그리고 xargsGNU stat:

find . -type f -print0 | xargs -0r stat -c '%s/%n'

이 특정 문제의 경우 이 GNU 버전은 실제로 필요하지 않습니다. GNU는 어쨌든 find지원하기 때문입니다(그러나 표시할 수 없는 파일에 대한 정보를 찾는 printf등 다른 상황에서는 유용할 수 있습니다 ).statfind ... -printf

그러나 FreeBSD와 Mac OS X는 또 다른 이야기입니다.

find그리고 xargsFreeBSD(및 Mac OS X) stat:

find . -type f -print0 | xargs -0r stat -f '%z/%N'

선택적으로 출력을 파이프하여 각 파일 이름의 시작 부분을 sed -e 's:/./:/:'제거합니다 ./.

내 FreeBSD 테스트 VM의 샘플 출력:

# find . -type f -print0 | xargs -0r stat -f '%z/%N' | sed -e 's:/./:/:' | head
149/.k5login
254/.profile
1169/.cshrc
297/.login
5589/.history
171/.ssh/known_hosts
1803/.ssh/authorized_keys
6699/.bash_history
368/.bashrc
4065/.viminfo

관련 정보