как использовать find (или другую команду) для извлечения числа после подчеркивания в имени файла - PullRequest
0 голосов
/ 04 февраля 2020

Это должно быть быстро для тех, кто умеет кодировать, в отличие от меня ...

Я пытаюсь написать базовый c bash скрипт, где он будет:

(i) посмотрите на номер одного файла с именем counter_, например counter_1, counter_2 в каталоге, и извлеките номер после _ (ii) создайте новую переменную из извлеченного номера для управления задачей (iii) сохраните новый счетчик в то же место с шагом 1 (iv) повторите

, т. е. если counter_1 - это файл в расположении:

find /path/to/file -name 'counter_*' | some magic that extracts the digits after the _|
CounterNumber="number extracted above"

# my script here using the CounterNumber variable

rm  /path/to/file/counter_$CounterNumber
touch /path/to/file/counter_$(CounterNumber+1)

и т. д., процесс повторяется для counter_2

Заранее благодарен за любую помощь

1 Ответ

0 голосов
/ 06 февраля 2020
CounterNumber="$(find /path/to/file -name 'counter_*' | awk -F_ 'BEGIN{sum=0} {sum+=$NF} END{print sum}')"
# your script...
rm "/path/to/file/counter_$CounterNumber"
touch "/path/to/file/counter_$((CounterNumber+1))"

Давайте разберем вызов awk в первой строке;

awk -F_ 'BEGIN{sum=0} {sum+=$NF} END{print sum}'

С man awk:

-F fs

- разделитель полей fs

Use fs for the input field separator (the value of the FS predefined variable).

Это означает, что awk будет разбивать текст на _, если -F не указан пробел будет использоваться по умолчанию.

Часть BEGIN выражения awk будет выполняться один раз перед выполнением какой-либо обработки. Здесь мы инициализируем переменную, которая будет отслеживать нашу сумму,

Вторая группа {} будет работать для каждой строки, переданной в awk, обновив переменную sum последним полем. В этом случае $1 = counter, $2 (а также последнее поле, $NF) - это то, что когда-либо было числом.

Часть выражения END будет выполняться один раз , прежде чем awk выйдет, поэтому просто распечатайте значение sum.

...