2016-06-28 3 views
-1

У меня есть куча файлов (более 1000) на это как следующиеавтоматически переименовывать файлы

$ ls 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-dev.lc 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-dev.lex 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-train.lc 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-train.lex 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm.lc 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm.lex 
org.allenai.ari.solvers.termselector.ExpandedLearner.lc 
org.allenai.ari.solvers.termselector.ExpandedLearner.lex 
org.allenai.ari.solvers.termselector.ExpandedLearnerSVM.lc 
org.allenai.ari.solvers.termselector.ExpandedLearnerSVM.lex 
.... 

Я должен переименовать эти файлы файлы, добавив learners перед капитализированным именем. Например

org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm.lex 

сменится на

org.allenai.ari.solvers.termselector.learners.BaselineLearnersurfaceForm.lex 

и это один

org.allenai.ari.solvers.termselector.ExpandedLearner.lc 

сменится на

org.allenai.ari.solvers.termselector.learners.ExpandedLearner.lc 

Любые идеи, как сделать это автоматически?

+0

Я пробовал, но это не тривиально (по крайней мере для меня), как использовать его синтаксис для этой цели. – Daniel

+0

Если слово перед «Столичным письмом» файлов одинаково, вам даже не понадобится регулярное выражение. Простая утилита переименования linux выполнит задание 'rename termselector. termselector.learners. орг. * '. – alvits

+0

Пожалуйста, взгляните на: [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – Cyrus

ответ

0
for f in org.*; do 
    echo mv "$f" "$(sed 's/\.\([A-Z]\)/.learner.\1/' <<< "$f")" 
done 

Эта короткая петля выводит mv, которая переименовывает файлы так, как вам хотелось. Запустите его как есть - сначала, и когда вы уверены, что он делает то, что вам нужно, удалите echo и запустите снова.

sed биты в середине принимает имя файла ($f, через здесь струну, так что это требует bash) и заменяет первое вхождение буквы после точки с .learner. следует той же заглавной буквой.

0

Очень простой подход (полезно, если вам нужно только сделать это один раз), чтобы ls >dummy их в текстовый файл dummy, а затем использовать поиск/замена в текстовом редакторе, чтобы сделать строки в форме mv xxx.yyy xxx.learners.yyy. Затем вы можете просто выполнить полученный файл с ./dummy.

Точная поиска/замены команды зависят от текстового редактора вы используете, но что-то вроде

  1. заменить org. с mv org.. Это дает вам mv в начале.
  2. заменить mv org.allenai.ari.solvers.termselector.$1 на mv org.allenai.ari.solvers.termselector.$1 org.allenai.ari.solvers.termselector.learner.$1, чтобы дублировать имя файла и вставить learner.

Существует также синтаксис с for, который может сделать это, вероятно, в одной строке, (длинный), но я не могу это объяснить - попробуйте help for, если вы хотите узнать об этом.

1

Есть инструмент под названием perl-rename, sometimes rename. Не путать с rename from util-linux.

Это очень хорошо для таких задач, как это, как это имеет выражение PERL и переименовывает соответственно:

perl-rename 's/(?=\.[A-Z])/.learners/' * 

You can play with the regex online

Alternative вы можете для цикла и $BASH_REMATCH:

for file in *; do 
    [ -e "$file" ] || continue 
    [[ "$file" =~ ^([^A-Z]*)(.*)$ ]] 
    mv -- "$file" "${BASH_REMATCH[1]}learners.${BASH_REMATCH[2]}" 
done 
Смежные вопросы