Удалить начальные нули из середины имени файла в Bash

Это два отдельных вопроса.

Очевидно, что RMS собирается одобрить адаптацию ноутбука с BIOS, которая является бесплатным программным обеспечением и не имеет закрытых -исходных кодов . Так что отвечает на это.

Первый вопрос заключается в том, почему люди могут и работают над coreboot (, который принимает некоторые блобы ), а затем libreboot, в первую очередь на этих старых моделях Thinkpad.

AUIU, основная серия Thinkpad, возможно, является ноутбуком премиум-класса. За исключением игрового оборудования. И не говоря уже о компьютерах Mac, которые представляют собой тяжелую битву за поддержку чего-либо стороннего -производителя из-за большого объема пользовательской работы. Они прочно сложены (и обычно долговечны ). Серия X -была удобно небольшой до появления «ультрабуков» для бизнеса (в тонком форм-факторе в стиле Mac Air ).

По какой-то причине они остановились на премиальных чипах Intel, а не на конкурентах. И возвращаясь, по крайней мере, к первой презентации Мэтью Гаррета на эту тему, если вы хотите, чтобы Linux работал на вашем ноутбуке, ищите Intel — это хорошее практическое правило. В частности для Wi-Fi. Intel пишет восходящие драйверы.

(Совсем недавно проект Dell Sputnik сделал их более привлекательными для некоторых пользователей Linux. Dell также предлагает беспроводную связь Intel в качестве опции ).

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

Наконец, -обратите внимание, что это модели X60 и X200, старые . Коммерческие продукты libreboot представляют собой «восстановленные», бывшие в употреблении -машины. Thinkpads популярны в бизнесе, они служат долго, а потом их продают. (Libiquity заявляют о некоторых новых частях, но не уточняя, какие именно,мы также можем предположить, что они имеют в виду наклейки ). Итак, у нас есть популярная модель, которая существовала достаточно долго, чтобы люди могли решить проблему блоба, и которая все еще доступна для использования, окупая первоначальные инвестиции.

0
27.07.2019, 20:43
3 ответа

Это вопрос выбора правильного регулярного выражения для соответствия заменяемой строке.

Вы пометили вопрос тегом sed.

В sedс синтаксисом ERE (, чтобы избежать нескольких\):

s#(chunk_)0+([0-9]+\.)#\1\2#

Это заменит текстchunk_(и зафиксирует его как первую обратную ссылку \1), за которой следует любое количество (хотя бы один )из (ведущих )нулей 0+, за которыми следует любое количество числа (по крайней мере один ), за которым следует точка \.и преобразовать то, что было сопоставлено с обратными ссылками \1\2(, удалив несколько ведущих нулей ).

Со старым, но более переносимым синтаксисом это:

s#\(chunk_\)0\{1,\}\([0-9]\{1,\}\.\)#\1\2#

Это преобразит:

for file in./BRNSPC_varID_chunk*.txt; do
    filenew=$(echo "$file" | sed -E 's#(chunk_)0+([0-9]+\.)#\1\2#')
    echo mv -n "$file" "$filenew"
done

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

В bash можно сделать:

regex='(.*chunk_)0+([0-9]+\..*)'

for file in./BRNSPC_varID_chunk*.txt; do
    if [[ $file =~ $regex ]]; then
        filenew=$(IFS=;printf '%s' "${BASH_REMATCH[@]:1}") 
        echo mv -n "$file" "$filenew"
    fi
done

Это напечатает этот тип списка:

mv -n./BRNSPC_varID_chunk_000000.txt./BRNSPC_varID_chunk_0.txt
mv -n./BRNSPC_varID_chunk_0000.txt  ./BRNSPC_varID_chunk_0.txt
mv -n./BRNSPC_varID_chunk_00011.txt ./BRNSPC_varID_chunk_11.txt
mv -n./BRNSPC_varID_chunk_000.txt   ./BRNSPC_varID_chunk_0.txt
mv -n./BRNSPC_varID_chunk_00.txt    ./BRNSPC_varID_chunk_0.txt
mv -n./BRNSPC_varID_chunk_010.txt   ./BRNSPC_varID_chunk_10.txt
mv -n./BRNSPC_varID_chunk_011.txt   ./BRNSPC_varID_chunk_11.txt
mv -n./BRNSPC_varID_chunk_012.txt   ./BRNSPC_varID_chunk_12.txt
mv -n./BRNSPC_varID_chunk_013.txt   ./BRNSPC_varID_chunk_13.txt
mv -n./BRNSPC_varID_chunk_014.txt   ./BRNSPC_varID_chunk_14.txt
mv -n./BRNSPC_varID_chunk_015.txt   ./BRNSPC_varID_chunk_15.txt
mv -n./BRNSPC_varID_chunk_01.txt    ./BRNSPC_varID_chunk_1.txt
mv -n./BRNSPC_varID_chunk_02.txt    ./BRNSPC_varID_chunk_2.txt
mv -n./BRNSPC_varID_chunk_03.txt    ./BRNSPC_varID_chunk_3.txt
mv -n./BRNSPC_varID_chunk_04.txt    ./BRNSPC_varID_chunk_4.txt
mv -n./BRNSPC_varID_chunk_05.txt    ./BRNSPC_varID_chunk_5.txt
mv -n./BRNSPC_varID_chunk_06.txt    ./BRNSPC_varID_chunk_6.txt
mv -n./BRNSPC_varID_chunk_07.txt    ./BRNSPC_varID_chunk_7.txt
mv -n./BRNSPC_varID_chunk_08.txt    ./BRNSPC_varID_chunk_8.txt
mv -n./BRNSPC_varID_chunk_09.txt    ./BRNSPC_varID_chunk_9.txt
mv -n./BRNSPC_varID_chunk_0.txt     ./BRNSPC_varID_chunk_0.txt

Обратите внимание, что он корректно работает с несколькими нулями.

0
28.01.2020, 02:18

Использованиеrename:

rename 's/(BRNSPC_varID_chunk_)0([0-9])/$1$2/' *.txt

*.txtрасширится до всех .txtфайлов в текущем каталоге.

rename будет искать любой файл, содержащий BRNSPC_varID_chunk_0[0-9]Если первая группа совпадений — BRNSPC_varID_chunk_, а вторая группа совпадений — конечная [0-9], она заменит это только первой и второй группой совпадений (, исключая ноль посередине ).

1
28.01.2020, 02:18

Дано

$ touch BRNSPC_varID_chunk_07.txt BRNSPC_varID_chunk_00.txt BRNSPC_varID_chunk_70.txt

затем хотя бы в bash, ksh,zsh

$ for f in./*chunk_0?.txt; do echo mv "$f" "${f/chunk_0/chunk_}"; done
mv./BRNSPC_varID_chunk_00.txt./BRNSPC_varID_chunk_0.txt
mv./BRNSPC_varID_chunk_07.txt./BRNSPC_varID_chunk_7.txt

Удалите echo, как только вы убедитесь, что он работает правильно.

Вы можете удалить префикс chunk, если нет двусмысленности (, т. е. если последовательность _0не может встречаться в другом месте в имени ).

Существует множество других менее переносимых решений с rename, mmvи т. д., например, с использованием renameиз util-linux:

.
rename.ul -n -v chunk_0 chunk_./*chunk_0?.txt

(удалите -n, чтобы фактически переименовать ).

3
28.01.2020, 02:18

Теги

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