PC의 모든 파일 목록을 만듭니다.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
출력은 다음과 같아야합니다.
"size/file_name" 56872/file.txt 98566/test 1000254/foo
PC에서 오류 발생
find: -printf: unknown primary or operator
해결 방법이 있습니까?
댓글
Answer
-printf
옵션이 POSIX
에 없습니다. find
. 예를 들어 Linux와 같은 GNU find
의 기능입니다.
특정 구현 사용중인이 표시되지 않습니다. 확장자가없는 POSIX 일 수 있습니다. 예를 들어 FreeBSD 또는 OSX 에 없습니다.
그렇지 않으면 다음과 같은 대안을 사용할 수 있습니다 (예 : 삽입 된 공백 등을 처리하지 않지만 도구에 대해 거의 가정하지 않음).
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
사용 가능한 도구에 대한 자세한 정보를 통해 (일반적으로) 솔루션을 개선 할 수 있습니다.
댓글
- 제발 어떻게 만들 수 있습니까? 출력 목록 " file_size / file_name " 위와 같이?
-
ls
언제find ... -print0
를 사용하고xargs -0r stat ...
에 파이프하는 것이 훨씬 나을까요?stat
의 GNU 및 FreeBSD 버전은 모두 출력 형식을 지정하는 (불행히도 다르거 나 호환되지 않는) 옵션을 가지고 있으며 OP에 필요한대로size/filename
를 표시 할 수 있습니다. . - OP는 특정 플랫폼 별 솔루션을 가정 할 수있는 정보를 제공하지 않았습니다.
답변
find
및 xargs
(GNU 포함 stat
) :
find . -type f -print0 | xargs -0r stat -c "%s/%n"
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"
선택적으로
각 파일 이름의 시작 부분에서 ./
를 제거합니다.
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
find
가 사용됩니까?