Как переместить каждый файл в папке в подкаталог с таким же именем?

tcpdumpвидит пакеты до того, как они достигают фильтрации локального порта . Если вы видите входящий пакет в tcpdump, но он не достигает приложения, которое, как вы уверены, его прослушивает, это означает, что пакет отбрасывается или модифицируется брандмауэром.Но если вы вообще не видите входящий пакет с помощью tcpdump, это означает, что пакет был отброшен до того, как он достиг вашей машины.


Вот еще немного информации о брандмауэре Linux, которая не поможет вам здесь, но поможет выяснить, были ли пакеты отброшены на вашу машину.

Ufw — это инструмент для управления брандмауэром. Механизм брандмауэра — netfilter . Вы можете получить список правил сетевого фильтра с помощью команды iptables. Полный механизм включает в себя множество частей , но для исследования блокировки портов вам достаточно взглянуть на цепочку INPUT:

iptables -nvxL INPUT

Каждая строка представляет одно правило, и правила выполняются по порядку, пока однажды не будет принято решение по пакету (, например ACCEPTили DROPили ). Цепочки могут включать другие цепочки как «подпрограммы». Если никакое правило не принимает решение, применяется политика сети. iptables -nvxLбез аргументов выводит список всех цепочек. Рядом с каждым правилом указано количество пакетов, и если вы отправляете пакет и задаетесь вопросом, где он теряется, проверка значений счетчика до и после часто является дешевым способом выяснить это.

0
24.10.2021, 08:21
3 ответа

Поскольку вы используете zsh, это можно сделать так:

for name (*.ext<->(.)) mkdir -p -- $name:r && mv -- $name $name:r 

или, используя более знакомую длинную форму цикла for,

for name in *.ext<->(.); do
    mkdir -p -- $name:r &&
    mv -- $name $name:r
done

Это перебирает все обычные файлы, соответствующие шаблону *.ext<->, где <->соответствует любому числу. Это квалификатор glob (.), который обеспечивает сопоставление только обычных файлов. Измените весь шаблон на *.*(.), если вы хотите, чтобы имя файла соответствовало любому обычному файлу, содержащему точку; мы требуем, чтобы точка присутствовала, поскольку вы хотите удалить расширение имени файла позже. Чтобы использовать более строгий, а не более свободный шаблон, используйте что-то вроде filename-<->.ext<->(.). Этот шаблон требует, чтобы вы знали, что хотите сопоставлять имена, начинающиеся со строки filename-.

Расширение $name:rприведет к тому же значению, что и $name, но без расширения (, т. е. только "корень" )значения.

Мы используем --, чтобы сообщить об окончании опций как mkdir, так и mv, чтобы имена, начинающиеся с дефиса, не были ошибочно приняты за опции.

4
24.10.2021, 08:59

Используйте этот цикл for, который совместим как с оболочками bash, так и с оболочками zsh:

for file in *.*; do
  [ -f "$file" ] &&
    mkdir -p -- "${file%.*}" &&
    mv -- "$file" "${file%.*}/"
done
  • -pопция в mkdirгарантирует, что ошибка существования файла не возникает
  • %.*удаляет расширение из имен файлов.
1
24.10.2021, 08:44

Используя GNU parallel (инструмент, я только начинаю осознавать возможности):

ls | parallel 'mkdir -p {.}; mv -i {} {.}'

Поскольку это никоим образом не связано с процессором, я думаю, что parallelне даст никаких преимуществ в скорости, но все же оно короче, чем многие другие приведенные решения.

И это не зависит от шаблона имен файлов.

1
24.10.2021, 17:59

Теги

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