У нас есть много отчетов о задании от системы, которые экономят на нашем сервере Linux с префиксом O*****.TXT
. В файле идентификатор процесса отчета.
Что сценарий может я выполнять для поиска всех 'O****.TXT
файлы в каталоге, и переименовывают каждый файл с идентификатором процесса из каждого файла? например:
Поиск OAAJWNZN.TXT
для ProcID:0000019324
, переименовать OAAJWNZN.TXT
кому: 0000019324.TXT
.
Затем, после того как этот файл переименован, сценарий переходит на следующий файл в каталоге и делает то же.
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"
метод. Затем мы пропускаем в следующий файл.
Делает 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
Можно использовать 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
распечатайте результат после редактирования