Это дает мне список путей ко всем текстовым файлам:
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
все остальные поля и печатает только имя файла.