Переименуйте несколько каталогов в командной строке

У меня есть некоторые названные папки:

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 но не уверенный, что я должен использовать и как сделать это.

2
задан 11 February 2017 в 17:16

2 ответа

предварительное имя

Самый простой путь состоял бы в том, чтобы использовать 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

Небольшая проблема с 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

Конечно, другие инструменты могут использоваться также. Например, 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/
10
ответ дан 2 December 2019 в 01:29

Перейдите в папку, содержащую все папки, которые вы хотите переименовать, и выполните:

find . * | rename 's\Session\Folder\'
-1
ответ дан 2 December 2019 в 01:29

Другие вопросы по тегам:

Похожие вопросы: