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

Да, PCMemTest — это переработанный Memtest86+, который можно загрузить из UEFI. У него все еще есть одно ограничение при загрузке из UEFI :: если CSM не включен, клавиатуру нельзя использовать, что означает, что конфигурацию нельзя изменить.

Кроме того, само ядро ​​Linux содержит инструмент проверки памяти :опция memtestбудет запускать проверку памяти с использованием до 17 шаблонов (в настоящее время ). Если вы добавите memtestк параметрам загрузки вашего ядра, оно будет запускать все тесты при загрузке и резервировать любые сбойные адреса, чтобы они не использовались. Если вы хотите меньше тестов, вы можете указать количество шаблонов (memtest=8, например ).

Это не так обширно, как тесты Memtest86+, но все же дает довольно хорошие результаты.

Некоторые ядра дистрибутива не включают эту функцию; вы можете проверить, доступен ли он, выполнив поискCONFIG_MEMTESTв конфигурации вашего ядра (try/boot/config-$(uname -r)). Ядро не будет жаловаться, если вы укажете memtest, но оно его не поддерживает; когда он запустится, вы должны увидеть вывод, например

[    0.000000] early_memtest: # of tests: 17
[    0.000000]   0x0000000000010000 - 0x0000000000099000 pattern 4c494e5558726c7a
[    0.000000]   0x0000000000100000 - 0x0000000003800000 pattern 4c494e5558726c7a
[    0.000000]   0x000000000500d000 - 0x0000000007fe0000 pattern 4c494e5558726c7a
[    0.000000]   0x0000000000010000 - 0x0000000000099000 pattern eeeeeeeeeeeeeeee
[    0.000000]   0x0000000000100000 - 0x0000000003800000 pattern eeeeeeeeeeeeeeee
[    0.000000]   0x000000000500d000 - 0x0000000007fe0000 pattern eeeeeeeeeeeeeeee
[    0.000000]   0x0000000000010000 - 0x0000000000099000 pattern dddddddddddddddd
[    0.000000]   0x0000000000100000 - 0x0000000003800000 pattern dddddddddddddddd
[    0.000000]   0x000000000500d000 - 0x0000000007fe0000 pattern dddddddddddddddd
[    0.000000]   0x0000000000010000 - 0x0000000000099000 pattern bbbbbbbbbbbbbbbb
[    0.000000]   0x0000000000100000 - 0x0000000003800000 pattern bbbbbbbbbbbbbbbb
...

во время загрузки ядра (или в журналах загрузки, позже ).

Вы можете использовать QEMU, чтобы почувствовать это.:

qemu-system-x86_64 -kernel /boot/vmlinuz-$(uname -r) -append "memtest console=ttyS0" -nographic

(или тот, который qemu-system-...подходит для вашей архитектуры ), и найдите «ранний _memtest». Чтобы выйти из QEMU после паники ядра, нажмите Ctrla , c , q , Enter .

1
24.04.2020, 20:43
2 ответа

Предполагая, что слова разделены SPC, TAB или NUL и первое слово находится в первой строке, попробуйте:

for file (*.txt) {
  read -r word rest < $file && mv -i -- $file $word.txt
}

Для разделения только на SPC замените readна IFS=' ' read.

Я не знаю, на каком языке должен быть написан этот rename File.ReadAllText('*.txt').split(' ')[0]код, но это определенно не zshсинтаксис (и не синтаксис любой другой оболочки, которую я знаю ).

Более прямой zshперевод того, для чего, как я полагаю, предназначен код, будет:

for file (*.txt) mv -i -- $file ${$(<$file)[1]}

Хотя при этом читается и разбивается весь файл в памяти и не выполняется много проверок ошибок. Этот разбивается на SPC, TAB, NUL или NL и не ограничивается тем, что первый находится в первой строке.

Чтобы сделать это быстрее, вы можете запустить zmodload zsh/filesзаранее, что заменит команду mvвстроенной версией (, сохраняя дорогостоящие fork и exec при вызове ).

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

rename '
  if (open FILE, "<", $_ and my $line = <FILE>) {
    chomp $line;
    my @words = split " ", $line;
    $_ = "$words[0].txt" if @words;
  }'./*.txt

Здесь используются одинарные кавычки, так что то, что внутри них, дословно передается в perlкак код языка perl.

Вы также можете изменить *.txtна *.txt(.)или *.txt(-.), чтобы рассматривать только обычный файл (, пропуская каталоги, FIFO, устройства и другие нестандартные типы файлов -).

2
19.03.2021, 02:26

В vimя бы сделал следующее (, хотя это чертовски грязно):

:$!ls *.txt, который дает вам список всех .txtфайлов в вашем каталоге

:%norm A `sed 1q < | cut -f1 -d' '`

Это добавляет шаблон для команды, которая получает первое слово в файле (или первое слово, за которым следует пробел, а [обычно это считается одним и тем же] ), которое будет завершено в ближайшее время...

:%norm 0vf yf<p, чтобы получить имя файла из нашего списка, который мы создали ранее, и вставить его после<

:%norm Imv˽, чтобы добавить команду перемещения и пробел в начале каждой строки.

:w command.sh, чтобы сохранить его как сценарий, который можно запустить через chmod +x command.shи запустить с помощью./command.sh

ПРЕДУПРЕЖДЕНИЕ:

Санитарная обработка не проводится. То есть не проверяется уникальность первого слова в файле. Это может быть дано вашим приложением, но в общем случае это не так. Поэтому возможно, что переименование файла в его первое слово содержимого приводит к тому, что файлы перезаписывают друг друга. По этой причине делать это нежелательно.

0
19.03.2021, 02:26

Теги

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