удар, не читая $TERMINFO на входе в систему (по SSH)

Другой подход: мы просто нуждаемся в размере файла и не заботимся об именах файлов, таким образом, мы можем избавиться от любых "странных" имен файлов, таких как "имена с CR в них, имена с пробелами, и т.д.":

 find /some/path -maxdepth 2 -type f -ls -exec printf '\000' \; \
     | tr -cd ' -~\000' \
     | tr '\000' '\n'   \
     | awk  '{ sum+=$7 } END { print "total size: ",sum }'

Прием:

1) мы печатаем вывод "-ls" каждого файла, СОПРОВОЖДАЕМЫЙ "\000" символ (на следующей строке, но это не проблема, посмотрите шаг 2),
2) мы избавляемся от всего 'non-ascii-printable' (включая '\t' и '\n'. Но мы действительно сохраняем также \000 в дополнение к "регулярному" печатаемому ASCII, поскольку нам нужен он для знания, где строка каждого файла заканчивается!). Тем путем имена файлов больше не имеют никаких причуд в них (никакой '\n', никакой '\t', не''; и т.д.). Мы действительно сохраняем пробелы также, поскольку нам нужны они также для обнаружения 7-го поля "-ls", т.е. размера файла
3) мы переводим добавленные '\000' в '\n' (шаг 2), избавленный от тех также, в случае, если некоторые имена файлов содержали их также!)
4) затем мы добавляем 7-й столбец для получения заключительного размера в байтах.

Это очень портативно (не нуждайтесь в "-print0", и т.д.),

3
13.04.2017, 15:36
1 ответ
[1131398]Бэш загружает запись в базу данных терминалов только при ее запуске (как и большинство программ) или при изменении переменной [1131757]TERM[1131758]. Изменение переменной [1131759]TERMINFO[1131760] не имеет немедленного эффекта: используется только при загрузке записи терминальной информации, не вызывает перезагрузки. [12203]При запуске [1131761]exec bash[1131762] запускается новый экземпляр bash, который загружает запись терминала на основе текущих значений [1131763]TERM[1131764] и [1131765]TERMINFO[1131766].[12204]Вы можете перезагрузить базу данных терминала, присвоив ей значение [1131767]TERM[1131768]. Bash оптимизирует [1131769]TERM=$TERM[1131770], он не перезагружает данные, поэтому вам нужно пройти через промежуточное значение.[12205]
2
27.01.2020, 21:28

Теги

Похожие вопросы