Ваша команда find
ничего не делает, поскольку команда mv
содержит статическое имя файла. Вам нужно что-то, что находит файлы со смешными персонажами (где мы действительно не знаем без дополнительной информации, что точно вы имеете в виду под «смешным»), а затем запускаете mv
на каждое найденное имя файла.
Я не могу представить простой способ сгенерировать имя файла без забавного символа, не создавая подоболочку, поэтому давайте просто передадим все найденные файлы в подоболочку, которая выполняет цикл и генерирует новые имена.
Мое «смешное» выражение содержит довольно ограниченный набор «несмелых» символов и рассматривает все остальное как «смешное». Возможно, вы захотите расширить его еще несколькими символами (возможно, вы хотите сохранить :
и/или !
и/или +
и т. Д. И т. Д., Но не забудьте сохранить -
в качестве первого символа после оператора отрицания !
).
funny='[!-A-Za-z0-9_./]'
export funny # Make this variable visible in the subshell we spawn, too
find . -type f -name "*$funny*" -exec bash -c 'for f; do
mv "${f}" "${f//$funny/}"; done' _ {} \+
Это использует Bash интерполяцию строки ${variable//from/to}
заменить все вхождения «забавных» символов; и find -exec \+
, чтобы передать как можно больше найденных файлов в одну подоболочку. Если ваш find
не поддерживает это, вам понадобится рефакторинг.
Это не является полностью надежным - если имя файла состоит исключительно из «смешных» символов, подстановка приведет к созданию пустого имени файла, которое не разрешено (хотя, если путь действителен, он будет перемещен на сам, что безвредно, как таковое).
Если вы хотите поэкспериментировать, измените mv
на echo mv
и поиграйте. Когда вы увидите результаты, которые вам нравятся, измените их.