переместить файлы на уровень выше, добавив имя папки -к имени файла -?

Я считаю, что функциональность 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

-1
14.08.2020, 05:08
2 ответа

С помощью отдельной команды Perl rename:

rename -n 's|/||' */*

Если все выглядит нормально, удалите -n, а затем удалите оставшиеся пустые каталоги.

rmdir {0..9}
2
18.03.2021, 23:13

С инструментами 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
0
18.03.2021, 23:13

Теги

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