Вывод формата к определенной длине строки

Принятие использования chmod от GNU coreutils пакет на Ubuntu 12.10.

chmod 775 . -R выполняется fchmodat системный вызов каждого файла, который это находит независимо от того, нужно ли для полномочий изменение или нет. Я подтвердил это и осмотром кода и использованием strace chmod 775 . -R (отрывок ниже) для списка фактического поведения.

newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775)                  = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775)                  = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775)                  = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775)                  = 0

Существует несколько недостатков выполнения fchmodat на каждом файле

  • Дополнительный системный вызов, вероятно, станет значительным, если большое количество файлов будет изменено. find/xargs/chmod метод, упомянутый другими, вероятно, будет более быстрым, только изменяя файлы то изменение потребности.
  • Вызов к fchmodat изменяет модификацию состояния файла (ctime) каждого файла. Это заставит каждый file/inode изменяться каждый раз и вероятно вызовет избыточные записи на диск. Могло бы быть возможно использовать, монтируют опции остановить эти избыточные записи.

Простой эксперимент показывает изменения ctime, происходящие для прямо chmod

auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

Но это не изменяется для find/xargs/chmod несколько минут спустя

auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

Я был бы всегда склонен использовать find/xargs/chmod версия, потому что находят, дает больше контроля выбором вещей.

5
24.07.2014, 01:32
3 ответа

Вместо этого используйте fmt:

fmt --width=80 file

Из man fmt:

-w, --width=WIDTH
              maximum line width (default of 75 columns)
6
27.01.2020, 20:32

Нижеприведенное решение может помочь:

cat file_name.txt | fmt -w 80 > reduce_file_name.txt

fmt - простой оптимальный формат текста

.
3
27.01.2020, 20:32

Используйте свертку следующим образом:

fold -s -w80 file

Это будет разделено только на пробелы ( -s ), используя ширина строки 80 символов ( -w80 ). Таким образом, он делает то же самое, что и решения fmt , но также позволяет прерывать любой символ, опуская параметр -s .

7
27.01.2020, 20:32

Теги

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