내 컴퓨터에 있는 모든 파일을 나열했습니다.
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
그리고 xargs
GNU stat
:
find . -type f -print0 | xargs -0r stat -c '%s/%n'
이 특정 문제의 경우 이 GNU 버전은 실제로 필요하지 않습니다. GNU는 어쨌든 find
지원하기 때문입니다(그러나 표시할 수 없는 파일에 대한 정보를 찾는 printf
등 다른 상황에서는 유용할 수 있습니다 ).stat
find ... -printf
그러나 FreeBSD와 Mac OS X는 또 다른 이야기입니다.
find
그리고 xargs
FreeBSD(및 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