2016-01-13 2 views
0

У меня есть основной каталог как Темы и внутри, у меня есть подкаталоги и под-подкаталоги. Подкатегории похожи на Beta_0.00 1, Beta_0.002, Beta_0.005 и Beta_0.01.Как переименовать определенные файлы во всех подкаталогах в unix?

В каждом подкаталоге есть под-подкаталоги, такие как Iter_100, Iter_500, Iter_1000.

У меня есть четыре имени файла, которые содержат специальные символы. Например:

Aviva_buys_US_insurer_for_?1.6bn.txt 

Я хочу, чтобы переименовать этот файл как Aviva_buys_US_insurer_for_1.6bn.txt. Аналогично, другие файлы со специальными символами, удаляя специальные символы.

Я попытался с помощью:

find . -type f -exec mv Aviva_buys_US_insurer_for_?1.6bn.txt Aviva_buys_US_insurer_for_1.6bn.txt {} \; 

Но это не работает. Как это исправить? Пожалуйста помоги!

ответ

3

Ваша команда 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 и поиграйте. Когда вы увидите результаты, которые вам нравятся, измените их.

Смежные вопросы