Я только что столкнулся с этой проблемой. Похоже на ошибку в 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. Мне понадобится запись для каждого хоста...
Следует сделать следующее:
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