Как переименовать несколько файлов, изменив один компонент имени файла?

/dev/memобеспечивает доступ ко всему физическому адресному пространству. Микропрограмма BIOS является частью этого адресного пространства (. Ваш компьютер должен иметь некоторый код для запуска при включении питания -).

Таким образом, Linux «не копировал информацию SMBIOS в память», 0xe0000— это базовый адрес BIOS с древних времен, и чтение этого через /dev/memбудет считываться непосредственно из ПЗУ (, если только BIOS не заменил себя с теневой оперативной памятью во время процесса загрузки, но опять же, это не имеет ничего общего с Linux ).

3
18.10.2021, 09:00
2 ответа

Если все, что вы действительно хотите сделать, это заменить 4Mна 4_M, тогда вариант вашего регулярного выражения делает это:

$ ls
something_4M_something_something_manyothersomethings.csv
$ rename -n 's/4M/4_M/' *
'something_4M_something_something_manyothersomethings.csv' would be renamed to 'something_4_M_something_something_manyothersomethings.csv'

Регулярное выражение работает со всем внутри имени, поэтому вам не нужно делать что-то конкретное, чтобы сохранить ведущее «что-то».

Если вы хотите сделать что-то еще, например переместить первое «что-то» во второе «что-то» или ограничить 4Mпервым вхождением после подчеркивания, отредактируйте свой вопрос и уточните.


Как отмечено в комментариях, -nвыполняет пробный -запуск, поэтому он показывает, что должно было бы произойти, и на самом деле не выполняет операцию.

Поскольку пример в вопросе уже использовал -n, я исходил из того, что это понял спрашивающий.

11
18.10.2021, 09:56

Использование Raku (, ранее известного как Perl _6)

Для одного файла:

    ~$ raku -e ' \
    my $name = dir(test => /^ something_4M_somethingelse \. csv $/)[0]; \
    my $modname = S/^ something_<(4M)>_somethingelse \. csv $/4_M/.IO given $name; \
    ($name,$modname).say; \
    #rename($name,$modname, createonly => True);'

Для нескольких файлов:

    ~$ raku -e ' \
    my @names = dir(test => /^ something_<digit><upper>_somethingelse \. csv $/); \
    my @modnames = do for @names {S/^ something_<(<digit><upper>)>_somethingelse \. csv $/$<digit>_$<upper>/.IO given $_;}; \
    for [Z] @names,@modnames -> ($x,$y) { ($x,$y).say }; \
    #for [Z] @names,@modnames -> ($x,$y) { rename($x,$y, createonly => True) };'

Ввод каталога:

~$ ls
something_4M_somethingelse.csv  something_5N_somethingelse.csv  something_6O_somethingelse.csv

Вывод каталога (несколько -переименование файла):

~$ ls
something_4_M_somethingelse.csv something_5_N_somethingelse.csv something_6_O_somethingelse.csv

ПРЕДОСТЕРЕЖЕНИЕ:Сначала делайте резервные копии!!

Краткое объяснение (однократное -переименование файла ):получение dir()списка интересующего файла --с помощью регулярного выражения -соответствия ("наречие" )вариант test => /... /, и брать только один элемент независимо от ([0]), сохраняя его в скалярной переменной $name.Проверка этой переменной показывает, что это объект .IO.

Используйте знакомую идиому S///для изменения переменной given $nameи сохраните измененное имя как $modname. Обратите внимание, что S///преобразуется в строку, поэтому вызов метода .IOдобавляется в конец S///, так что $modnameтакже является объектом .IO.

В регулярном выражении незнакомым символом может быть обозначение <(…)>. Но это всего лишь маркеры захватаРаку , поэтому, хотя распознается все совпадение в левой половине S///, захватывается и модифицируется только совпадение 4Mв пределах <(…)>в правой половине S///.

Если нужные начальные/конечные .IOобъекты получены, строка ($name,$modname).say;должна выдавать вывод, аналогичный следующему:

("something_4M_somethingelse.csv".IO "something_4_M_somethingelse.csv".IO)

Когда все выглядит хорошо, вы можете раскомментировать последнюю rename()строку кода Raku, чтобы фактически переименовать файлы, перечисленные в предпоследней строке, на .say.

Примечание :Включение наречия/параметра createonly => Trueв код rename()выше означает, что rename()не затирает существующее имя файла (более короткая форма :createonlyделает то же самое ). Удалите наречие/параметр createonly => Trueили :createonly, чтобы получить значение по умолчанию (False, т.е. затирание )и разрешить переименование -в (перезапись -из )предварительно -существующего файла /имя файла.

https://docs.raku.org/syntax/S$SOLIDUS$SOLIDUS$SOLIDUS
https://docs.raku.org/routine/rename
https://raku.org

1
08.11.2021, 16:05

Теги

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