Сортировать все текстовые файлы по размеру, создав текстовый список путей

Сортировать все текстовые файлы по размеру, создав текстовый список путей

Это дает мне список путей ко всем текстовым файлам:

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 toolset 7-й столбец может отличаться в MacOS)
  • Будет sortвыполнена числовая сортировка по 7-му столбцу (размер файла)
  • Удаляет awkвсе остальные поля и печатает только имя файла.

Связанный контент