Переименовать определенные файлы

14908 is the input message from client. 14910 and 15337 are the two ouput messages.

14910 — это ответ клиенту, в котором явно установлен флаг PSH, поэтому он был немедленно отправлен сервером. Затем сервер ждет ACK от клиента перед отправкой 15337.

14910 is not delayed. But 15337 is delayed around 40ms.

Это время, которое требуется ACK (15336 )для передачи от клиента к серверу, для обработки сервером и для передачи следующего пакета от сервера к клиенту.

As I can see, the 15337 packet is not sent until the ack 15336 is received.

Верно. Так обычно работает TCP.

So can you please help me understand what causes this delay.

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

Вы можете заметить, что между пакетом 15337 и пакетом 15756 (существует примерно одинаковая разница во времени, которая немного короче: 39,87 мс против 39,93 мс ). Разница в количестве пакетов между этим обменом составляет 419 по сравнению с первым обменом на 426.

Таким образом, можно предположить, что эта «задержка» является результатом отправки/получения клиентом значительного объема другого трафика между моментом, когда он отправляет ACK на сервер, и моментом, когда с сервера поступает следующий пакет.

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

0
03.11.2020, 14:23
4 ответа
ls  11-Vnnn_S2_L001_aaa_bbb_ccc_ddd.ext| awk -F "[-_]" '{print "mv " $0" "  $2".ext"}' |sh

Проверено, работает нормально

0
18.03.2021, 22:52

Вы можете попробоватьrename:

rename 's/^[^-]+-([^_]+).+(\.[^.]+)$/$1$2/' *.ext

извлечет часть между первым -и первым _и добавит к ней расширение. Сначала попробуйте rename -n '...', а затем удалите -n.

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

  • Все с начала до первого -:^[^-]+-, т. е. строка, начинающаяся с одного или нескольких символов, которые являются , а не -, за которыми следует один -.
  • «группа захвата», содержащая все после этого, вплоть до первого, но исключая его _:([^_]+), т. е. один или несколько символов, которые не являются_-фактическим значением, могут позже упоминаться как $1в замещающем тексте
  • все после этого, вплоть до последнего, но исключая .:.+, что на самом деле означает только «один или несколько символов любого вида» -значение «до последнего .» происходит от определение последней части
  • «группа захвата», содержащая последний .и все после этого до конца -строки -:(\.[^.]+)$-эта формулировка требует, чтобы содержимое группы захвата начиналось с литерала ., а затем содержит только символы , а не ., до конца строки $; только это гарантирует, что предыдущая группа сожрет все, кроме последней .. Опять же, на фактический контент позже можно ссылаться как $2(, так как это вторая группа захвата в регулярном выражении ).

Замещающий текст состоит только из фактического содержимого двух групп захвата:$1$2.

1
18.03.2021, 22:52

Простой цикл:

for name in *.ext; do 
    newname=${name%%_*}.ext
    newname=${newname#*-}
    echo mv -- "$name" "$newname"
done

Это перебирает все имена, которые заканчиваются на .extв текущем каталоге (, поэтому сначала перейдите в нужный каталог ). Для каждого такого имени переменная newnameсначала устанавливается в часть имени до его первого символа _, а в конец добавляется .ext. Затем значение перед первым символом -удаляется, чтобы создать окончательное значение newname.

Используемые здесь замены двух параметров ${variable%%pattern}и ${variable#pattern}удаляют самую длинную совпадающую подстроку patternс конца значения $variableи самую короткую совпадающую подстроку с начала соответственно.

Запустите с командой echo, чтобы убедиться, что она работает правильно, а затем удалите echoперед mv, чтобы действительно переименовать файлы.

2
18.03.2021, 22:52

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

for file in *
do
    if [[ "$file" =~ ^[^-]*-([^_]+)_.*\.ext$ ]]
    then
        mv "$file" "${BASH_REMATCH[1]}.ext"
    fi
done

Что это делает:

forпеременнаяinсписок элементов, разделенных пробелами

перебирает каждый элемент в списке, устанавливая переменную и выполняя команды между doи done.

*означает каждый файл в текущем каталоге ,попробуй echo *. [[встроенная версия старой команды test:Документация

Теперь нужно распаковать это сложное регулярное выражение.:

^-Начало строки ввода за которым следует[^-]-любой символ, кроме -,*-повторяется любое количество раз , за которым следует -. Теперь вас интересует часть между (). Bash сохраняет совпадающие части между круглыми скобками в массивеBASH_REMATCH(ссылка). Регулярное выражение для этого [^_]+, что означает любой символ, кроме _, , повторенный хотя бы один раз , за которым следует _.

.-любой символ , *повторяется любое число раз *, за которым следует \.литерал.(см. здесь ), за которым следуют extи $, конец ввода (строки).

Поскольку вводом было наше имя файла, извлекается первая часть между -и _и сохраняется в ${BASH_REMATCH[1]}. Если имя входного файла соответствует этому шаблону, мы просто используем обычное старое mv, чтобы переименовать $fileв our_matched_part.ext, кавычки не являются строго обязательными, если ваши имена файлов не содержат пробелов, но являются хорошей практикой.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ :Ах, дерьмо. AdminBee отредактировал свой пост, я этого не увидел. О, ну...

EDIT2 :Вы можете дополнительно ограничить регулярное выражение, чтобы переименовывать только определенные файлы, а не каждый файл *-something_*.ext, добавляя больше литеральных частей или, например, [0-9]+для чисел.

1
18.03.2021, 22:52

Теги

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