Я считаю, что функциональность ipv4 и ipv6 на самом деле является результатом путаницы, связанной с наличием нескольких реализаций (ответвлений )или совершенно разных версий. Если вы будете искать, вы наткнетесь на упоминания о nc6
. Эта реализация, похоже, есть в дистрибутивах на основе BSD.
Я бы попробовал установить nc6
на ваш конкретный дистрибутив и запустить его вместо nc
для поддержки ipv6.
Мне удалось найти эту фиксацию от 2018 года -01 -11 -добавить патч IPv6 , который явно добавляет функциональность IPv6 обратно в то, что вы называете более новая версия netcat.
ПРИМЕЧАНИЕ:У меня есть доступ только к nc 7.50 в моих системах, и он, как вы описываете, поддерживает как -4
, так и -6
.
Я подозреваю, что то, что вы считаете более новой версией netcat, на самом деле является гораздо более старой версией:http://nc110.sourceforge.net/.
Если вам нужен исчерпывающий список различных реализаций, он доступен в вопросе Википедии о Netcat .
The original version of netcat was a Unix program. The last version (1.10) was released in March 1996.1
В большинстве дистрибутивов Linux используется GNU netcat или версия NMAP:
There are several implementations on POSIX systems, including rewrites from scratch like GNU netcat[5] or OpenBSD netcat,6 the latter of which supports IPv6 and TLS. The OpenBSD version has been ported to the FreeBSD base7 and Windows/Cygwin.8 Mac OS X comes with netcat installed as of OSX 10.13 or users can use MacPorts to install a variant.[9] There is also a Microsoft Windows version of netcat available.[10]
Например, в CentOS 7.x:
$ nc --version
Ncat: Version 7.50 ( https://nmap.org/ncat )
$ rpm -qf /bin/nc
nmap-ncat-6.40-13.el7.x86_64
С помощью отдельной команды Perl rename
:
rename -n 's|/||' */*
Если все выглядит нормально, удалите -n
, а затем удалите оставшиеся пустые каталоги.
rmdir {0..9}
С инструментами POSIX,
find. -type f -exec sh -c 'for f; do dirn="${f%/*}"; mv -- "$f" "$dirn${f##*/}"; done' sh {} +
find
вызывает оболочку и выполняет цикл for для каждого файла.
dirn="${f%/*}"
получает имя родительского каталога, исключая все, что находится после (, и включая )последнюю косую черту в имени файла.
${f##*/}
получает имя файла без пути, исключая все, что предшествует (, и включая )последнюю косую черту в имени файла.
Эти две конструкции оболочки делают то же самое, что иdirname
и basename
, поэтому эквивалентной формой команды является
find. -type f -exec sh -c 'for f; do mv -- "$f" "$(dirname "$f")$(basename "$f")"; done' sh {} +
, хотя этот процесс должен быть медленнее, так как для каждого файла необходимо запускать два дополнительных процесса.
Если вам не нужно спускаться более чем в один каталог, как показано в вашем примере, это делает простой цикл оболочки:
for f in */*; do dirn="${f%/*}"; echo mv -- "$f" "$dirn${f##*/}"; done