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

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

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

Поиск OAAJWNZN.TXT для ProcID:0000019324, переименовать OAAJWNZN.TXT кому: 0000019324.TXT.

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

7
задан 22 December 2016 в 03:55

3 ответа

awk управляет, чтобы считал файл и переименовал его:

awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT

Начиная с ProcID строка на самом деле:

JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45

Для извлечения меня P мы должны разделить и на : и на ), который даст нам 0000019324 как второе поле.

Удаляют echo для фактического выполнения перемещения. Используйте это, только если имена файлов и ProcID не содержат пробелы или специальные символы.

Эта команда добирается ProcID путем разделения на : для получения второго поля, затем использует его и специальная переменная FILENAME для построения команды. документация awk's GNU предлагает printf ... | "/bin/sh" метод. Затем мы пропускаем в следующий файл.

7
ответ дан 23 November 2019 в 06:13
  1. Цикл через файлы.
  2. можно использовать grep для нахождения Перемещения ProcID
  3. , файл к новому имени файла

Делает 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 November 2019 в 06:13

Можно использовать 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 к чему-то еще
  • .*\.TXT соответствуйте любым символам, сопровождаемым литералом . и затем TXT
  • sed вызовите нашего друга sed считать файл и вещи извлечения от него
  • -n ничего не печатайте, пока мы не попросим его
  • -r используйте ДО, таким образом, мы не должны выходить () или +
  • ( |^) расположите с интервалами или запуститесь строки
  • ProcID:([0-9]+) по крайней мере одна цифра после ProcID... на потом сохраняет число
  • ( |$) пространство или конец строки
  • \2 обратная ссылка на шаблон, сохраненный ранее с ()
  • p распечатайте результат после редактирования
6
ответ дан 23 November 2019 в 06:13

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

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