Запись символа N времен с помощью команды printf

Да это довольно возможно. То, что необходимо сделать, - то, что необходимо считать все имена файлов в пути и счете на пробелы, e.t.c точек. Если Вы хотите сделать это эффективно, можно использовать этот поток: Как я выполняю действие со всеми файлами с определенным расширением в подпапках изящным способом?

Теперь, после того как Вы считали файлы в пути, необходимо установить правило.

Например, давайте рассмотрим эту структуру:

 .test
  .test.subfolder
   .test.subfolder.subsubfolder

То, что необходимо сделать, - то, что необходимо считать возникновение слова sub в каждых из имен файлов. Таким образом, если количество: 0, это - родительская папка, если количество: 1, это - 1-й ребенок уровня, если количество: 3-> это - 2-й ребенок уровня и т. д. и т. п. (уровень выведен, формируют структуру, обеспеченную Вами),

Следовательно возможный псевдо код будет похож:

  if(filename contains(".test"))
  {
   searchCount("sub");
   if(count ==0)
   parent();
   else if(count ==1)
   1stLevelChild();//and so on
  }

Теперь согласно результату, который Вы получаете здесь, просто необходимо использовать команду перемещения для перемещения файлов в соответствующие папки.

12
04.02.2016, 22:30
3 ответа

В этом случае %. 0s всегда печатает один экземпляр символов, предшествующих ему, h в этом случае. Когда вы используете {1..5000}, оболочка расширяет ее, и она становится:

printf 'H%.0s' 1 2 3 4 ... 5000 > H.txt

IE, команда PrintF теперь имеет 5000 аргументов, а для каждого аргумента вы получите один H. Итак, не должен быть последовательным Или числовые:

printf 'H%.0s' a bc fg 12 34

принты HHHHHH - т. Е. Количество аргументов, 5 в этом случае.

Примечание, эллипсы в 1-м примере выше не вставляются буквально, они там, чтобы указать последовательность или диапазон.

7
27.01.2020, 19:54

Вы можете использовать TCPFLOW , чтобы сделать это. С сайте:

TCPFLOW представляет собой программу, которая захватывает данные, передаваемые как часть соединений TCP (потоки), и хранит данные таким образом, чтобы это удобно для анализа протокола или отладки. Программа, такая как «TCPDUMP», показывает сводку пакетов, видимых на проводе, но обычно не хранит данные, которые фактически передаются. Напротив, TCPFLOW восстанавливает фактические потоки данных и сохраняет каждый поток в отдельном файле для более позднего анализа.

Он будет выбросить журналы в текущий рабочий каталог в формате [IP]. [Порт] - [IP]. [PORT].

# mkdir http_logs
# cd http_logs
# tcpflow dst port 80

В этом примере регистрируются все пакеты TCP, переходя в порт 80 и сохраняют их в текущем каталоге для легкой отладки. Вы также можете отфильтровать дальше, используя Фильтры PCAP .

Вы также можете найти коммутатор -A -A , что позволяет обработать пост. Например, он помещает заголовки и тела HTTP в отдельные файлы.

-121--119327-

%. 0s означает преобразование аргумента как строку , с точностью нуля. Согласно Человек 3 Printf , точное значение в таком случае дает

   [ ... ] the  maximum  number  of characters to be printed from a
   string for s and S conversions.

, следовательно, когда точность равна нулю, аргумент строка вообще не печатается. Однако H H (который является частью спецификатора формата), напечатана столько раз, как есть аргументы, поскольку в соответствии с разделом Printf человек Bash

The format is reused as necessary to consume all  of  the  argu‐
ments.  If the format requires more arguments than are supplied,
the extra format specifications behave as if  a  zero  value  or
null  string,  as  appropriate,  had  been supplied. 
8
27.01.2020, 19:54

Эта команда зависит от оболочки, генерирующей 5000 аргументов и передающей их в printf, которая затем игнорирует их. Хотя это может показаться довольно быстрым - и относится к некоторым вещам - оболочка все равно должна генерировать все эти строки в виде аргументов (и делимитировать их) и так далее.

Кроме того, что сгенерированные Hs не могут быть выведены на печать до тех пор, пока оболочка не выполнит первый итерационный цикл до 5000, эта команда также стоит в памяти всего, что нужно для хранения и разделения числовых аргументов строк на printf plus Hs. Так же просто можно сделать:

printf %05000s|tr \  H

...которая генерирует строку из 5000 пробелов - которые, по крайней мере, обычно составляют всего один байт на человека и не стоят ничего, чтобы их делимитировать, так как они не делимитированы. Несколько тестов показывают, что даже для 5000 байт стоимость вилки и трубы, требуемой для tr, стоит даже в этом случае, и почти всегда, когда цифры становятся больше.

Я бежал...

time bash -c 'printf H%.0s {1..5000}' >/dev/null

... и...

time bash -c 'printf %05000s|tr \  H' >/dev/null

Каждое примерно 5 раз за кусок (ничего научного здесь - только анекдот) и версия расширения скобки в общем времени обработки в среднем составляла чуть более 0,02 секунды, но версия tr в среднем приходила примерно в 0,012 секунды - и версия tr каждый раз бьёт её. Не могу сказать, что я удивлён - {расширение браузера} является полезной интерактивной оболочкой, но обычно это довольно расточительная вещь, когда речь идёт о любом виде скриптинга. Общая форма:

for i in {[num]..[num]}; do ...

...если подумать, на самом деле это два для циклов - первый цикл внутренний и подразумевает, что оболочка должна каким-то образом генерировать эти итераторы перед сохранением их всех и повторной итерацией для вашего для цикла. Обычно лучше делать такие вещи, как:

iterator=$start
until [ "$((iterator+=interval))" -gt "$end" ]; do ...

...потому что вы сохраняете только очень мало значений и перезаписываете их по ходу, а также выполняете итерацию, пока генерируете итераторы.

В любом случае, как и в случае с пробелами, упомянутыми выше, вы также можете использовать printf для обнуления произвольного количества цифр, конечно, например:

printf %05000d

Я делаю и то, и другое без аргументов, потому что для каждого аргумента, указанного в строке формата printf, когда аргумент не найден, используется нулевая строка - которая интерпретируется как ноль для цифрового аргумента или как пустая строка для строки.

Это другая (и - на мой взгляд - более эффективная) сторона медали по сравнению с командой в вопросе - в то время как можно ничего не получить из чего-то, как вы делаете, когда вы printf %.0 строк длиной для каждого аргумента, так что также можно получить что-то из ничего.

Еще быстрее для большого количества генерируемых байтов можно использовать аргумент dd, например:

printf \\0| dd bs=64k conv=sync 

...и w/ обычные файлы dd аргумент seek=[num] может быть использован с большей выгодой. Вы можете получить 64k новых строк вместо нулей, если добавите ,разблокируйте cbs=1 и оттуда можете вводить произвольные строки на строку с помощью paste и /dev/null - но в этом случае, если он вам доступен, вы можете использовать его с тем же успехом:

yes 'output string forever'

Вот еще несколько примеров dd:

dd bs=5000 seek=1 if=/dev/null of=./H.txt

...который создает (или усекает) заполненный файл \0NUL в текущей директории с именем H.txt размером 5000 байт. dd ищет прямое смещение и NUL-заполняет все за ним.

<&1 dd bs=5000 conv=sync,noerror count=1 | tr \\0 H >./H.txt

...который создает файл с таким же именем и размером, но заполненный w/ H chars. Он использует поведение спецификации dd для записи хотя бы одного полного нуль-блока в случае ошибки чтения, когда указаны noerror и sync преобразования (и - без count= - скорее всего, будет продолжаться дольше, чем можно было бы желать), и намеренно перенаправляет дескриптор файла только для записи на stdin dd.

20
27.01.2020, 19:54

Теги

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