awk 'BEGIN{ OFS=FS=":" }
{
if (NR==FNR) {
pwd[$1]=$2
} else {
if ($2 ~ /^!/ && $1 in pwd) $2=pwd[$1]
print
}
}' shadowA shadowB
Когда первый файл shadowA
будет обработан (NR==FNR
), сохраните хэш пароля в массиве pwd
с именем пользователя в качестве индекса.
Когда второй файл shadowB
обрабатывается(else
)и второе поле начинается с!
(может быть !
или!!
)и имя пользователя присутствует в массиве паролей ($1 in pwd
), затем обновите значение второго поля. После этого выведите текущую строку shadowB
.
Есть несколько проблем с вашими find
попытками, но вы на правильном пути.
Ограничение глубины рекурсии find
, чтобы переименованные каталоги не искались сами по себе. используйте для этого параметр -maxdepth
и обратите внимание, что он должен идти до тестов, но после корня (, то есть между .
и-type d
).
Поскольку ваша команда rename
предполагает, что вы находитесь в каталоге непосредственно над тем, который вы переименовываете, вам нужно использовать действие execdir
вместо exec
. Как и большинство других действий, exec
выполняется из find
верхнего каталога (, т.е. .
в вашем случае ), и ему передается весь путь сверху до «найденной» записи, не просто имя файла (, т.е. в вашем случае exec
передается что-то вроде./Test1/2. - 1. Data
). execdir
устраняет обе эти проблемы.