Перемещение файла на основе его содержимого

debug1: key_load_public: No such file or directory

Строка выше - это не ошибка, а простой отладочный журнал, говорящий о том, что ssh клиент не может найти отдельный открытый ключ (с именем ~/.ssh/id_rsa.pub). Этот файл не нужен для подключения к удаленному серверу, но он может быть полезен.

Фактическая ошибка

ssh_exchange_identification: read: Connection reset by peer

указывает на ошибку в конфигурации сервера. Сервер запущен, но не может принять SSH-соединение. Проверьте журнал сервера для получения дополнительной информации. Похожие проблемы

2
08.08.2017, 18:13
1 ответ

С инструментами GNU (Оболочка GNU или другая оболочка с поддержкой ksh подстановка процессов (<(...)), GNU xargsили совместимая, как FreeBSD (для -a, -r,-0), GNU mvдля -t, GNU awkдляnextfile(также поддерживается некоторыми другими реализациями; он будет проигнорирован, но менее эффективен там, где не поддерживается)):

xargs -r0a <(
  find dir -type f -exec awk 'FNR == 2 {
    if (substr($0, 8, 2) == "EL" && substr($0, 42, 4) == "2017")
      printf "%s\0", FILENAME
    nextfile}' {} +)  echo mv -it /somewhere

(удалить echoесли доволен)

В системах, отличных от -GNU, вы можете изменить его на:

{
find dir -type f -exec awk -v q="'" '
  function quote_for_xargs(s) {
    gsub(q, q "\\" q q, s)
    gsub("\n", q "\\\n" q, s)
    return q s q
  }
  FNR == 2 {
    if (substr($0, 8, 2) == "EL" && substr($0, 42, 4) == "2017")
      print quote_for_xargs(FILENAME)
    nextfile
  }' {} + | xargs sh -c '
  [ "$#" -eq 0 ] || exec echo mv -i "$@" /somewhere <&3 3<&-' sh
} 3<&0

(удалить echoесли устраивает ).

То есть иметь findвызов awkдля каждого текстового файла. В awkдля второй строки каждого файла (FNR==2), если выполняются условия, выведите имя файла в формате, подходящем для вводаxargs(xargs, который рассматривается как список слов, разделенных пробелами или символами новой строки, и где одинарные и двойные кавычки, а также обратную косую черту можно использовать для экранирования разделителей или друг друга ). Например, файл с именем ./That's tough.logбудет выводиться как './That'\''s tough.log'.

xargsиспользует этот вход для передачи как можно большего количества аргументов в sh. Нам нужна оболочка sh, потому что каталог назначения должен быть последним аргументом. Нам нужен -i, потому что, поскольку файлы попадают в один и тот же каталог, существует вероятность потери данных, если перемещаются два файла с одинаковым именем в разных каталогах. Нам нужен mvстандартный ввод (для -iподсказки )к , а не быть каналом из find, следовательно, использование временного fd 3 для пересылки внешнего стандартного ввода на shдля sh, чтобы установить mvстандартный ввод для этого.

2
27.01.2020, 22:09

Теги

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