Как мне написать скрипт bash, чтобы заменить слова в файлах, а затем переименовать файлы? - PullRequest
0 голосов
/ 14 января 2011

У меня есть структура папок, как показано ниже:

alt text

Мне нужно создать скрипт bash, который выполняет 4 вещи:

  1. Этоищет все файлы в каталоге generic, находит строку «generic» и превращает ее в «нечто»
  2. Как указано выше, но изменяет «GENERIC» на «SOMETHING»
  3. Как указано выше, ноизменяет «Generic» на «Something»
  4. Переименовывает любое имя файла, имеющее «generic» в нем, в «нечто»

Сейчас я делаю этот процесс вручную, используя поиск изаменить в чистых бобах.Я не знаю много о сценариях Bash, но я уверен, что это можно сделать.Я думаю о чем-то, что я бы запустил, и это взяло бы «Нечто» в качестве входных данных.

С чего бы мне начать?какие функции я должен использовать?общее руководство было бы здорово.спасибо.

Я использую настольную версию Ubuntu 10.5.

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Редактирование

Подстановочной частью является сценарий sed - назовите его mapname:

sed -i.bak \
    -e 's/generic/something/g' \
    -e 's/GENERIC/SOMETHING/g' \
    -e 's/Generic/Something/g "$@"

Обратите внимание, что это также изменит слова в комментариях и строках, иизмените «общий» как часть слова, а не просто слово целиком.Если вам нужно только слово, то вы используете маркеры конечных слов вокруг терминов: 's/\<generic\>/something/g'.-i.bak создает резервные копии.

Вы применяете это с помощью:

find . -type f -exec mapname {} +

Это создает команду со списком файлов и выполняет ее.Ясно, что вы можете, если хотите, избежать промежуточного сценария mapname shell / sed (написав сценарий sed вместо слова mapname в команде find).Лично я предпочитаю отлаживать вещи по отдельности.

Переименование

Переименование файлов лучше всего делать с помощью команды rename, в которой есть два варианта, так что вам нужно будетпрочитайте ваше руководствоИспользуйте одно из этих двух:

find . -name '*generic*' -depth -exec rename   generic something   {} +

find . -name '*generic*' -depth -exec rename s/generic/something/g {} +

(Спасибо Stephen P за указание на то, что я использовал более мощный вариант на основе Perl rename с полным Perlспособность регулярного выражения и Зак и Джефроми для указания на то, что Perl найден в реальном мире * тоже.)

Примечания:

  • Переименовывает каталоги.
  • Вероятно, стоит хранить там -depth, чтобы содержимое каталогов переименовывалось перед каталогами;в противном случае вы можете получать сообщения, потому что вы переименовываете каталог, а затем не можете найти в нем файлы (потому что find дал вам старое имя для работы).
  • Более простой rename будет перемещен *Только от 1050 * до ./something/do_generic.java.Вам нужно будет выполнить команду более одного раза, чтобы изменить каждый компонент каждого имени файла.

* Используемая мной версия renameадаптировано из кода в 1-м издании книги «Верблюд».

1 голос
/ 14 января 2011

Шаги 1-3 можно выполнить следующим образом:

find .../path/to/generic -type f -print0 |
    xargs -0 perl -pi~ -e \
        's/\bgeneric\b/something/g; 
         s/\bGENERIC\b/SOMETHING/g;
         s/\bGeneric\b/Something/g;'

Я не совсем понимаю, что вы хотите сделать на шаге 4, поэтому я не могу помочь с этой частью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...