Найдите текст в файле, затем переименуйте файл с этим текстом

У нас есть ряд отчетов о заданиях из системы, которые сохраняют на нашем Linux-сервере префикс O*****.TXT. В файле находится идентификатор процесса.

Какой скрипт можно запустить для поиска всех файлов 'O****.TXT в каталоге и переименовать каждый файл с идентификатором процесса из каждого файла? например:

Найти OAAJWNZN.TXT для ProcID:0000019324, переименовать OAAJWNZN.TXT в 0000019324.TXT.

Затем, как только этот файл будет переименован, сценарий переместится на следующий файл в и делает то же самое.

1
задан 22 December 2016 в 14:55

2 ответа

Вы можете использовать for, rename и sed в каталоге, где находятся файлы:

for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*/\2/p' "$i").TXT/" "$i"; done

Удалить -n после rename после тестирования, чтобы фактически переименовать файлы

Объяснение

for i in O*TXT; do что-то делает со всеми соответствующими файлами rename -n, просто сообщите, что будет с новыми именами, на самом деле не переименуйте их (удалите -n после ) "s/old/new/" замените old на new (используйте двойные вместо одинарных кавычек, чтобы мы могли передавать переменные с расширением $). $(command) command substitution - передать вывод command на что-то еще .*\.TXT любые символы, за которыми следуют литералы ., а затем TXT sed вызывают наш друг sed, чтобы прочитать файл и извлечь из него вещи -n, ничего не печатайте, пока мы не попросим его -r использовать ERE нам не нужно избегать пробела () или + ( |^) или начала строки ProcID:([0-9]+) как минимум на одну цифру после ProcID ... сохранить номер для последующего пробела ( |$) или конца строки \2 обратная ссылка на шаблон, сохраненный ранее с помощью () p, распечатать результат после редактирования
6
ответ дан 23 May 2018 в 03:07
Прокрутите файлы. Вы можете использовать grep для поиска ProcID. Переместите файл в новое имя файла

. Сделайте cp вместо mv, если вы хотите сохранить старые файлы, или вы не уверены.

for file in 0*.TXT; do
  procid=$(grep -Po "(?<=ProcID:)[0-9]*" "$file");
  new_filename="/outputpath/${procid}.TXT";
  if [ ! -f "$newfilename" ]; then
    mv "$file" "$new_filename";
  fi;
done
4
ответ дан 23 May 2018 в 03:07

Другие вопросы по тегам:

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