Сортировка linux
Имеется домашний каталог, который имеет директорию dir1, которая в свою очередь имеет множество файлов и каталогов, которые также множество каталогов и файлов и так далее. Есть задание:
Рекурсивно подсчитать количество строк содержимого файлов из директории dir1, имя которых начинается на 's', отсортировать вывод по уменьшению количества, ошибки доступа не подавлять и не перенаправлять.
Моё решение
wc -l ~/dir1/s* */s* */*/s* ~/dir1/*/*/s* | gerp -v total | sort -r
Правильно ли оно? Не уверен что выводит то, что нужно, так как чтобы проверить нужно подсчитать вручную, что слишком долго из-за большего количества файлов.
Ответы (1 шт):
Ваше решение содержит три ошибки: нет рекурсивного обхода, gerp -> grep, sort не сортирует числа как надо.
Раз нужна рекурсия значит find.
find dir1
Каталоги нам не понадобятся, только файлы:
find dir1 -type f
Но и файлы нужны не все, а только s*. Кавычки нужны чтобы bash не делал автозамену:
find dir1 -type f -name 's*'
Считаем строки: wc -l. Считать нужно внутри find, для этого ключ -exec, который вставляет команду в команду. Понять это невозможно, но можно заучить: '{}' подставляет имя файла, \; завершает команду.
find dir1 -type f -name 's*' -exec wc -l '{}' \;
То что получилось надо отсортировать. | передаёт текст между командами, sort сортирует. Флаг n чтобы сортировать числа как числа, флаг r - сортировать задом наперёд:
find dir1 -type f -name 's*' -exec wc -l '{}' \; | sort -nr