모든 텍스트 파일을 크기별로 정렬하여 경로의 텍스트 목록을 생성합니다.

모든 텍스트 파일을 크기별로 정렬하여 경로의 텍스트 목록을 생성합니다.

그러면 모든 텍스트 파일의 경로 목록이 제공됩니다.

find / -type f -name '*.txt' > ~/Desktop/sorted.txt

각 항목의 파일 크기에 따라 이 경로 목록을 정렬하고 싶지만 무엇을 사용해야 할지 잘 모르겠습니다. 예상했던 대로 작동하지 않습니다.

find / -type f -name '*.txt' |sort -S > ~/Desktop/sorted.txt

어떤 제안이 있으십니까?

답변1

이 명령은 wc일치하는 각 파일에 대해 별도의 프로세스를 사용하므로 성능이 저하될 수 있습니다. 호환성과 POSIX 준수를 염두에 두고 만들었습니다.

find / -type f -name '*.txt' -exec wc -c {} \; | sort -t ' ' -n -k 1,1 | cut -d ' ' -f 2-

각각은 wc -c양식에 선을 생성합니다.

12345 /path/to/file/possibly with spaces/foo.txt

여기서 첫 번째 공백은 바이트 수와 경로를 구분합니다. sort모든 줄을 가져오고 공백 문자를 필드 구분 기호로 사용하며 첫 번째 필드에 따라, 즉 바이트 수에 따라 숫자로 정렬합니다. 그런 다음 cut공백 문자를 필드 구분 기호로 사용하고 두 번째 필드, 즉 첫 번째 필드를 제외한 모든 것, 즉 바이트 수를 제외한 모든 것, 즉 경로를 인쇄합니다.

이 솔루션은 줄 수를 기준으로 정렬하도록 쉽게 조정할 수 있습니다. wc -l대신 에 을 사용하면 됩니다 wc -c.


참고:
하나 이상의 개행 문자가 포함된 경로는 코드를 손상시킵니다. 코드가 이에 영향을 받지 않도록 하려면 널 문자를 구분 기호로 지원하는 도구를 사용할 수 있습니다. POSIX 도구를 사용하면 가능하다면 이것이 어렵습니다. 이 답변은 이식성에 중점을 두고 있으므로 텍스트 파일에 대한 모든 경로가 "좋은" 것이길 바랍니다.

답변2

도구를 함께 연결하는 (아마도 차선책인) 접근 방식을 항상 사용할 수 있습니다.

find / -type f -name '*.txt' -ls  | sort -nk7,7 | awk '{print $NF;}'
  • 찾기 스위치 -ls를 누르면 파일 크기를 포함한 여러 추가 열이 표시됩니다(GNU 도구 세트의 7번째 열은 MacOS에서는 다를 수 있음).
  • sort7번째 열(파일 크기)에서 숫자 정렬을 수행합니다 .
  • 다른 모든 필드를 제거 awk하고 파일 이름만 인쇄합니다.

관련 정보