Организация файлов по содержащимся в них датам

Я только что столкнулся с этой проблемой. Похоже на ошибку в openssh, и я не думаю, что есть способ ее избежать.

Я просмотрел исходный код openssh и нашел в main.c вызов функции «нижний регистр ()». Единственная причина, которую я могу придумать для этого, заключается в том, что имена хостов DNS обычно не имеют регистра :

.
1038
1039         /* If canonicalization requested then try to apply it */
1040         lowercase(host);
1041         if (options.canonicalize_hostname != SSH_CANONICALISE_NO)
1042                 addrs = resolve_canonicalize(&host, options.port);
1043

Позднее эта же переменная host будет использоваться в ssh _connect.:

1266         /* Open a connection to the remote host. */
1267         if (ssh_connect(host, addrs, &hostaddr, options.port,
1268             options.address_family, options.connection_attempts,
1269             &timeout_ms, options.tcp_keep_alive,
1270             options.use_privileged_port) != 0)
1271                 exit(255);

Наконец, код sshconnect.c также показывает, что в ProxyCommand поддерживаются только %h, %p и %r:

87   expand_proxy_command(const char *proxy_command, const char *user,
88       const char *host, int port)
89   {
90           char *tmp, *ret, strport[NI_MAXSERV];
91
92           snprintf(strport, sizeof strport, "%d", port);
93           xasprintf(&tmp, "exec %s", proxy_command);
94           ret = percent_expand(tmp, "h", host, "p", strport,
95               "r", options.user, (char *)NULL);
96           free(tmp);
97           return ret;
98   }

Мне тоже нужно оригинальное имя в верхнем регистре в ProxyCommand. Единственный способ получить это — удалить «*» и жесткий код без %h. Мне понадобится запись для каждого хоста...

1
21.10.2021, 15:02
1 ответ

Следует сделать следующее:

for file in ~/fileList/*
do
    newpath=$(head -1 "$file" | tr '-' '/')
    mkdir -p "$newpath"
    echo "would now execute 'mv $file $newpath'"
done

Это сохранит преобразованную дату в переменной $newpathи создаст этот каталог вместе со всеми отсутствующими родительскими элементами, если он еще не существует. Подкаталог будет создан в каталоге, в котором вы запускаете скрипт.

В текущей форме он напечатает команду, которая должна быть выполнена. Когда вы будете удовлетворены, измените на

mv "$file" "$newpath"

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

  • Если вы можете идентифицировать файлы по их расширению (, например. .txt), вы можете сделать цикл более конкретным :
    for file in ~/fileList/*.txt
    do
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
       ...
    done
    
  • В противном случае один из способов — принимать в качестве операндов только обычные файлы :
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    
2
21.10.2021, 15:43

Теги

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