Рекурсивное переименование подкаталогов

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.

0
07.11.2020, 22:16
1 ответ

Есть несколько проблем с вашими findпопытками, но вы на правильном пути.

  1. Ограничение глубины рекурсии find, чтобы переименованные каталоги не искались сами по себе. используйте для этого параметр -maxdepthи обратите внимание, что он должен идти до тестов, но после корня (, то есть между .и-type d).

  2. Поскольку ваша команда renameпредполагает, что вы находитесь в каталоге непосредственно над тем, который вы переименовываете, вам нужно использовать действие execdirвместо exec. Как и большинство других действий, execвыполняется из findверхнего каталога (, т.е. .в вашем случае ), и ему передается весь путь сверху до «найденной» записи, не просто имя файла (, т.е. в вашем случае execпередается что-то вроде./Test1/2. - 1. Data). execdirустраняет обе эти проблемы.

0
18.03.2021, 22:51

Теги

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