Переименование файла, в имени которого есть кавычка «

Зачем изобретать колесо, если fail2ban уже может сделать то, что вы хотите (и многое другое)?

С помощью fail2ban вы можете создать пользовательское правило, которое будет соответствовать любому запросу к данному веб-сайту (или всем размещенным веб-сайтам), и установить maxretry для этого правила на 2000.

Вы также можете установить bantime для этого правила на любое значение (например, bantime=86400 для блокировки этого IP на день).

По умолчанию, он также будет записывать каждое действие блокировки и разблокировки, например, в /var/log/fail2ban.log.

BTW, Возможно, вы захотите переосмыслить свою цель. 2000 запросов с одного IP - это не так уж много, особенно если каждая "страница", которую вы обслуживаете, содержит множество изображений, css файлов, javascript файлов и т.д. Или если этот IP-адрес является прокси (например, работает squid) для десятков или сотен машин в школьной или корпоративной сети. или для интернет-провайдера.

11
07.04.2014, 01:51
3 ответа

Завершение вкладки Bash должно работать правильно, если вы просто наберете mv 90843_O и нажмете вкладку. В противном случае существует один способ правильно избежать имени:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

Двойные кавычки устраняют необходимость экранировать ', но два символа обратной косой черты все равно необходимо экранировать (одна дополнительная обратная косая черта для каждого из них дает четыре обратных косой черты. ). Другой вариант:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

Здесь установка обратной косой черты в одинарные кавычки устраняет необходимость их экранирования, но вам нужно закончить одинарные кавычки, чтобы добавить литерал '. Это экранируется после окончания кавычек.

Обратите внимание, что проблема здесь как в использовании обратной косой черты в имени, так и в одинарной кавычке. Чтобы заменить последовательность \\ ' (поскольку в имени файла в вопросе есть две обратные косые черты, оба вызовут проблемы) на подчеркивание для всех файлов в каталоге с помощью цикла:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

-i заставит mv запросить, если какие-либо файлы будут перезаписаны. Использование prename ( переименовать ссылки на это во многих системах):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Удалите -n , когда вы счастливы, что он делает то, что вы хотите. Обратите внимание, что символы обратной косой черты должны быть экранированы внутри выражения perl, даже если они заключены в одинарные кавычки (без одинарных кавычек вам понадобится восемь обратных косых черт, поскольку четыре будут удалены оболочкой и не будут частью выражения perl).

6
29.04.2021, 00:41

Вы можете использовать переименовать для таких задач:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Если вы хотите заменить ' на _ вы также можете использовать переименование:

rename "s/\'/_/g" *
4
29.04.2021, 00:41

Гррр, @Graeme меня опередил, но я все равно отправлю сообщение ...

Если вы процитируете имя файла в двойных кавычках, например mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg , это поможет; использование -v необязательно, но оно расскажет, что он сделал. Я считаю, что есть и второй способ, кроме избавления от всех символов, - если - это даже возможно. Единственный известный мне недостаток этого способа заключается в том, что оболочка будет обрабатывать текст, поскольку он не заключен в одинарные кавычки, но он вообще не управляет им, поскольку это не внутренний код, и дополнительное время, необходимое для обработки, бессмысленно.

Только что протестировано, у вас может быть символ типа > в тексте, заключенном в двойные кавычки, и он будет считаться частью имени файла.

В качестве совета на будущее, вы можете использовать ./ прямо перед именем файла, если это вызывает проблемы, например файлы, начинающиеся с тире: mv ./-file file будет переименуйте -файл в файл . В таком случае вы не можете цитировать или экранировать имя файла в виде исключения.

Как ни странно, я мог бы создать файл 90843_O'ConnorPaul_GeneralManager.jpg , если бы я экранировал одинарную кавычку \ ', но он бы не создал его, если бы это не было либо в двойных кавычках, либо с экранированием.

PS: Завершение Bash - это еще один способ, он работал с проблемой имени файла с вашим файлом, но он не работает с файлами / папками "тире": просто напишите часть имени и нажмите Tab, все остальное сделает сам. .

-2
29.04.2021, 00:41

Теги

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