Поскольку требуется арифметика, sed
не правильный инструмент. В приведенном ниже решении используется awk
.
Вы говорите, что нежелательные хэши всегда имеют имена, которые включают число, за которым следует буква. В этом случае:
$ awk '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1
!
interface ethernet1
xxxx
yyyy
zzzz
!
interface ethernet2
aaa
bbb
ccc
!
interface FastEthernet0/1
ppp
qqq
rrr
!
Как это работает:
/ ^ interface. * [[: Digit:]] [[: alpha:]] /
Выбираются только те строки, которые начинаются с interface
, которые позже также включают число, за которым следует буква.
$ 0 = "interface ethernet" ++ f
Строки, выбранные, как указано выше, заменяются на interface ethernet
, а число и число увеличиваются каждый раз.
1
Это загадочное сокращение awk для print-the-line.
Чтобы изменить файл на месте, предполагая, что вы используете современную GNU awk, используйте:
awk -i inplace '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1
$ awk '/^interface /{$0="interface ethernet" ++f} 1' file
!
interface ethernet1
xxxx
yyyy
zzzz
!
interface ethernet2
aaa
bbb
ccc
!
Чтобы изменить файл на месте и предполагая современный GNU awk, используйте:
awk -i inplace '/^interface /{$0="interface ethernet" ++f} 1' file
Вы можете использовать stat -c% w filename
, он предоставит дату рождения в удобочитаемой форме, а -C
предоставит временную метку unix.
Время рождения поддерживается не во всех файловых системах; в этих случаях используйте stat -c% z
, то есть время последнего изменения.
Для последней части вашего вопроса: используйте find
, чтобы найти все файлы старше 5 * 60 минут ( -cmin
проверяет наличие время изменения в минутах, +300
означает более 300); {}
заменяется именем файла:
find in_dir -cmin +300 -type f -exec mv {} out_dir \;
Обновление: добавлен -тип f
, чтобы не перемещать сам in_dir в out_dir.
stat без параметров позволяет вам видеть все временные метки (рождение, доступ, изменение, изменение)