У меня есть некоторые названные папки:
Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8
Я хотел бы переименовать их всех к:
Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8
Как я пошел бы о выполнении этого в терминале самым эффективным способом?
Я знаю о mmv
mv
и rename
но не уверенный, что я должен использовать и как сделать это.
Самый простой путь состоял бы в том, чтобы использовать rename
или prename
, который является сценарием Perl (если Вы - a ksh
или mksh
пользователь, та оболочка имеет rename
встроенная функция, которая отличается, таким образом, ради непротиворечивости, я буду использовать prename
при обращении к тому сценарию Perl; альтернативно Вы могли звонить /usr/bin/rename
- полный путь к исполняемому файлу).
$ ls
Session 1/ Session 2/ Session 3/ Session 4/ Session 5/ Session 6/ Session 7/ Session 8/
$ prename 's/Session/Folder/' Session*/
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Если Вы нуждаетесь в рекурсивном поиске или удостоверяетесь, чтобы Вы нашли правильный тип объекта (возможно, у Вас также есть файлы со словом "Session" в имени файла), можно объединить это с find
утилита:
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Немного длинный, возможно, немного избыточный, но работы.
Небольшая проблема с mv
это, мы должны изменить имя места назначения каждый раз, когда так отдельно оно не может сделать то, что мы хотим. Чтобы сделать это, мы должны были бы объединить его с некоторыми другими инструментами, такой как find
или bash
инструменты.
$ ls
Session 1/ Session 2/ Session 3/ Session 4/ Session 5/ Session 6/ Session 7/ Session 8/
$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Что Вы видите, вот то, что мы - цикличное выполнение по всем объектам, которые содержат слово Session
в них и каталог. Мы используем $ 'расширения параметра {dir##*\}" для извлечения всего после пространства на название каталога (который является соответствующим числом), и сформируйте новую строку "Папка /".
В обоих prename
команды и mv
мы используем globbing, что означает, что эти подходы переименуют каждый каталог, который содержит слово "Session" в них, даже "Вздор сессии". Не идеальный, конечно, но для конкретного случая, где Вы знаете, Ваше именование папки последовательно, это будет работать. С другой стороны, мы могли увеличить команду с for dir in Session\ [1-9] ; do . . .done
.
Другими словами, этот подход может работать, но является очень упрощенным и не является лучшим.
Конечно, другие инструменты могут использоваться также. Например, Python:
$ ls
Session 1/ Session 3/ Session 5/ Session 7/
Session 2/ Session 4/ Session 6/ Session 8/
$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Перейдите в папку, содержащую все папки, которые вы хотите переименовать, и выполните:
find . * | rename 's\Session\Folder\'