Как пакетно переименовать файлы в терминале macOS?
У меня есть папка с рядом файлов с именем:
Я хотел бы пакетно удалить одно подчеркивание и средний контент, чтобы результат был следующим:
Актуально, но не полностью пояснительно:
В вашем конкретном случае вы можете использовать следующую bash команду ( bash это оболочка по умолчанию в macOS):
Примечание. Если есть вероятность, что имена ваших файлов начинаются с — , поместите — перед ними [1]:
mv — «$f» «$
Примечание: echo добавляется перед mv тем, чтобы выполнить пробный прогон. Удалите его, чтобы выполнить фактическое переименование.
Вы можете запустить его из командной строки или использовать в сценарии.
- «$
» представляет собой приложение bash расширения параметра : (первая) подстрока, соответствующая шаблону _*_ , заменяется литералом _ , фактически вырезая средний токен из имени. - Обратите внимание, что _*_ это шаблон (выражение с подстановочными знаками, которое также используется для подстановки), а не регулярное выражение (чтобы узнать о шаблонах, запустить man bash и найти Pattern Matching ).
Если вы часто сталкиваетесь с переименованием файлов в пакетном режиме, подумайте об установке специального инструмента, такого как rename утилита на основе Perl . В macOS вы можете установить его с помощью популярного менеджера пакетов Homebrew следующим образом:
Вот эквивалент команды вверху с использованием rename :
Опять же, эта команда выполняет пробный прогон; удалить, -n чтобы выполнить фактическое переименование.
- Аналогично bash решению s/. /. / выполняет подстановку текста, но, в отличие от bash настоящих , используются регулярные выражения .
[1] Назначение специального аргумента — , который поддерживается большинством утилит, состоит в том, чтобы сигнализировать, что последующие аргументы должны рассматриваться как операнды (значения), даже если они выглядят как опции из-за того, что они начинаются с — , как отмечает Джейкоб К.
Источник
Question: Q: Unix «rename» Terminal command available in OS X?
I have a couple of different cameras/phones that deliver their photos as
DSC00001.jpg
DSC00002.jpg
DSC00003.jpg
etc.
I want to be able to rename these files such that «DSC» is replaced by the camera or phone that took the shot. The «rename» command in Unix (and CMD prompt in XP) do exactly what I need. I just run
rename DSC*.jpg W580i*.jpg and all of file in the folder are renamed.
When I try and run the rename command in a Terminal in OS X, I get this error
mr-mbp:Pix_Xfer MR$ rename
-bash: rename: command not found
Is there a way to enable the rename command in OS X?
I found a nice script called «Replace Text in Item Names» that does what is needed however the command seems so much easier.
MBP 2.6, Mac OS X (10.5.5)
Posted on Oct 20, 2008 4:43 PM
All replies
Loading page content
Page content loaded
Oct 20, 2008 4:56 PM
rename is not a standard Unix command.
You could go over to and search for rename. You will find Mac OS X utilities such as *A Better Finder Rename*, FileRenamer, Renamer4Mac, AispireRenamer, *File Renamer*, etc.
If you really want to do this with the terminal, you could try
If you install Fink , there is gwenrename, krename, and ren that can be installed. Not sure how they work, but they might be options.
Oct 20, 2008 5:41 PM
BobHarris wrote:
rename is not a standard Unix command.
It’s included as an alias in some Unix systems for PC users.
Actually in Leopard you can
man rename
and get a result
but, the command is not in the system (too many letters to type when mv will do 🙂 )
Oct 20, 2008 5:43 PM
Actually in Leopard you can
man rename
and get a result
but, the command is not in the system (too many letters to type when mv will do 🙂 )
Oct 21, 2008 7:58 AM
Actually in Leopard you can
man rename
and get a result
but, the command is not in the system (too many letters to type when mv will do 🙂 )
*man rename* brings up a *Section 2* C programming API.
That’s absolutely correct
As I wrote:
man rename
produces a result
Oct 21, 2008 8:47 AM
If you really wanted Unix rename it’s quite easy:
1. Go here and d/l ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/v2.14/
2. Look for rename* in misc-utils after untar
3. Remove the preprocessor in rename.c for PACKAGE_STRING and the corresponding (%s)
4. compile it with gcc you get a.out, rename it to rename
You got yourself a unix rename
Jan 8, 2009 7:41 AM
It’s been awhile since I’ve dealt with C and gcc, so I’m getting lost in step 3 of your instructions. Could I trouble you to be a bit more explicit? Unix rename is our friend and I very much miss it.
Mar 12, 2009 8:38 PM
Mar 12, 2009 8:55 PM
The easy solution to this is as «VK» and «nerowolfe» suggest. use «mv».
The «mv» command IS the standard unix «rename» command. Just reference the same location (filepath) with a new filename and you will have a rename. For example:
File location:
/Users/username/textfile.txt
To rename this to «textfile2.txt» you would type:
mv /Users/username/textfile.txt /Users/username/textfile2.txt
Alternately, if you are in the «username» folder, or in any folder containing the file to be renamed, you do not need to reference the full path. as such:
mv textfile.txt textfile2.txt
Some paranoid people may wish to create a hard link of the file before renaming it, and then deleting the old file, since this will create a copy without removing a reference to the file for the brief microsecond that it takes to «move» the file using the «mv» command.
Mar 12, 2009 9:39 PM
If I were renaming a single file mv would be perfect, but I need to do many files at once. The practicum is that I have a set of files that have an underscore in the file name. I wrote a perl script that automatically generates LaTeX code to make a book for the pictures. However, the \includegraphics command in LaTeX does not care for underscores in filenames so I want to transliterate the underscores into something more LaTeX friendly, like dashes. With rename it’s as simple as this:
and all of my images that had underscores in their names are replaced with dashes. mv just isn’t practical when I’m looking at hundreds (or more) of images. That’s why I was so interested in the build of rename from linux — I don’t care what the source is, I just need the functionality.
Now, the rename.c file does have a shell script at the top that is a very decent substitute:
#!/bin/sh
if [ $# -le 2 ]; then
echo call: rename from to files; exit;
fi
FROM=»$1″
TO=»$2″
shift
shift
for i in $@; do N=`echo «$i» | sed «s/$FROM/$TO/g»`; mv «$i» «$N»; done
but the compiled C program does fix some potential issues, and it would also satisfy the purist in me that loves having a native compiled rendition of rename around.
Mar 12, 2009 10:20 PM
I should preempt advice about performing the file renaming in perl. Certainly that is an option but I prefer separation of duties. My perl script is for generating LaTeX and I don’t want it to tread into the realm of file management. There are also many uses for the rename utility — stripping version numbers from VMS files sprngs to mind. I am working under the assumption that the contributors to rename.c understand file management and renaming issues much more than I do — elsewise I’d stick with a perl or bash script.
Mar 12, 2009 11:25 PM
I was working on some file operations today and I remembered that I actually once wrote a rename utility in perl for working on Windows. I brushed it off and took out all of the Windows wackiness (the command line doesn’t expand blobs, etc.) and have another working solution. I’m not savvy enough to tell if it’s better than the shell script from rename.c or not, but it works for what I need it for.
#!/usr/bin/perl -w
#
# Simulate the ‘rename’ file utility
#
my $usage = «usage: $0 FROM_SPEC TO_SPEC filespec1 filespec2 filespec3\n»;
$usage .= «Example: $0 _ — *.txt *.log this_file.c\n\n»;
my $specFrom = shift || die «[Missing FROM_SPEC.]\n\n$usage»;
my $specTo = shift || die «[Missing TO_SPEC.]\n\n$usage»;
if ($#ARGV = 0) <
my $fileSource = shift;
my $fileTarget = $fileSource;
$fileTarget =
s/$specFrom/$specTo/g;
next if («$fileSource» eq «$fileTarget»);
print «\t[Processing $fileSource => $fileTarget]\n»;
if ( -e $fileTarget ) <
print «\t\t[$fileTarget aleady exists. Skipping.]\n»;
>
else <
rename $fileSource, $fileTarget;
>
>
Источник
Секреты Терминала. Часть 4: Операции над объектами
Мы возвращаемся к нашему циклу статей о Терминале Mac OS X, где излагаются премудрости работы на Маке через командную строку. Сегодня мы подходим к самому важному уроку — операции над файлами и папками. Мы рассмотрим команды для копирования, перемещения, переименования и удаления объектов — cp, mv, rm. Не удивляйтесь, что для четырёх названных действий предназначены три команды. Как вы узнаете из дальнейшего повествования, одна из них умеет гораздо больше, чем кажется сначала.
Итак, начнём с копирования и команды cp.
Стандартный синтаксис команды копирования такой:
cp -(параметры) (что копируем) (куда копируем)
Параметры команды, путь к копируемому файлу и адрес для размещения копии разделяются пробелами. А если пробел есть внутри какого-то из путей, то, как вы помните, надо либо поставить перед ним обратный слэш (\ пробел) или заключить весь путь в одинарные кавычки (‘путь с пробелами’).
Самое главное в этой команде — именно параметры. Например, без дополнительных параметров вы не сможете даже скопировать папку — по умолчанию команда cp работает только для отдельных файлов.
Этот параметр нужен, если вы копируете папку. Обратите внимание на очень важный нюанс: от того, как вы напишете путь к папке, зависит то, как она скопируется. Возьмёме простой пример: откройте Терминал и введите команду:
Вы получите ошибку о том, что Sites — это директория, и она не может быть скопирована.
Теперь попробуйте немного другой вариант:
Папка с сайтами скопируется на Рабочий стол. Попробуйте третий вариант:
Вы увидите, что на Рабочий стол скопировалась не сама папка сайтов, а только её содержимое.
Запомните это правило — слэш в конце пути копируемой папки не копирует её саму.
Это опасный параметр. Он означает, при совпадении имён копируемого файла с уже имеющимся в папке, куда он копируется, этот файл будет стёрт безо всяких предупреждений и уведомлений.
Это параметр для тех, кто склонен острожничать. При первом же совпадении имён вы увидите вот такой вопрос:
От того, что вы нажмёте на клавиатуре (y или n), будет зависеть судьба файла в папке назначения. Количество таких вопросов будет равно количеству объектов с совпадающими именами.
Это полная противоположность параметру -f. Копирование не перезапишет ни один файл с совпадающими именами и не задаст вам никаких лишних вопросов.
Данный параметр прикажет Терминалу при копировании сохранять атрибуты исходного файла: его владельца, права доступа, группу, время изменения и открытия. Всегда ставьте этот параметр, если вы копируете системные файлы. В противном случае их права будут безнадёжно испорчены, и вас могут ждать серьёзные ошибки в системе.
В этом случае Терминал покажет вам все скопированные файлы в формате «что копировалось» -> «куда скопировалось»:
Как всегда, параметры можно совмещать. И для вашего удобства параметр -R вполне разрешено писать строчными буквами.
Возникает вопрос, а что будет, если задать заведомо противоречащие параметры, например:
Отвечаем: в этом случае имеет значение порядок параметров. Второй параметр окажется сильнее первого, и копирование затрёт совпадающие по именам файлы. А вот если написать:
то параметр -n «пересилит» параметр -f.
(эквивалент cp -dpR ) — в этом случае команда не будет обрабатывать символьные ссылки, рекурсивно обрабатывает все подкаталоги и сохраняет новые атрибуты файлы, вроде имени владельца. Очень удобна в том плане, что всякого рода «ярлыки» и прочие вещи, которые информационной ценности не несут, будут просто проброшены данной командой.
Данная команда имеет двойное назначение — она умеет перемещать и переименовывать объекты. Очень многое здесь зависит от синтаксиса. Общий принцип работы у команды mv схож с cp:
mv -(параметры) (что перемещаем/переименовавываем) (куда перемещаем/во что переименовывыем)
Допустим, вы хотите переименовать файл File1.txt на рабочем столе в File2.txt. В Терминале вам понадобится команда:
Запомните: если в качестве второго адреса в команде mv задан путь к файлу, то произойдёт переименование. Разумеется, папка в первом и во втором пути должна быть одна и та же, тогда это уже не будет просто переименованием. Например, если вы введёте команду:
то с Рабочего стола файл File1.txt бесследно исчезнет. Зато в корне диска появится файл File2.txt с точно таким же содержимым.
И третья ситуация — просто перемещение (без переименования):
Файл будет перемещён с Рабочего стола в ваше папку «Загрузки». Иными словами, если в качестве второго адреса в команде mv задан путь к папке, то произойдёт перемещение.
Теперь о параметрах команды mv. Их всего четыре, и все они совпадают с параметрами команды cp:
- mv -f форсирует перезапись объектов с одинаковыми именами
- mv -n предотвращает такую перезапись
- mv -i каждый раз спросит вас о перезаписи
- mv -v покажет подробные сведения о перемещении
Обратите внимание на отсутствие параметра -R. Команде mv абсолютно всё равно, с чем она имеет дело. Она без лишних вопросов умеет перемещать и переименовывать как файлы, так и папки.
Эта команда предназначена для удаления объектов. Из всех рассмотренных в нашем курсе команд она наиболее опасна. Файлы удаляются навсегда и в обход Корзины. Восстановить их весьма проблематично. Именно поэтому всегда дважды (а то и трижды) проверяйте введённые вместе с командой rm параметры и аргументы!
Синтаксис у неё ещё проще:
rm -(параметры) (путь к удаляемому объекту)
А вот её параметры:
- rm -f форсирует удаление без предупреждений
- rm -i запрашивает подтверждение на стирание каждого объекта
- rm -v удаляет объекты в подробном режиме
Обратите внимание, что rm, как и cp, не умеет по умолчанию удалять директории. В связи с этим для неё актуален параметр -R (или -r).
Есть у rm и ещё один занятный параметр для конфиденциальной информации:
Заглавная P в числе параметров не просто удаляет файл, но и трижды перезаписывает место на диске, где он хранился, сводя вероятность восстановления данных к нулю.
Покажем ещё раз опасность команды rm. Допустим, вы хотели удалить папку Temp в корне диска:
и случайно опечатались, поставив пробел после слэша:
Так как у rm есть только один аргумент, она воспримет только то, что находится между параметрами -rf и следующим пробелом. А там у вас / — т.е. всё содержимое диска. А теперь подумайте, что ждёт ваш Мак, если вы выполните эту команду от имени корневого администратора (с приставкой sudo).
В связи с этим, старайтесь не использовать команду rm без параметра -i. Хоть это и нудно, зато обезопасит вас от многих роковых ошибок.
rmdir
Это безопасный аналог команды rm , применим в том случае, когда каталог пуст, в противном случае команда не удалит его, тем самым обезопасив Вас, не стирая папку с файлами, как если бы мы вызвали rm -rf . Настоятельно рекомендуем применять эту команду, если стоит цель удалить заведомо пустой каталог, не стоит применять рекурсивное удаление, мы можем затронуть то, что не хотели бы.
На этом сегодняшний урок по Терминалу можно считать оконченным. Далее по курсу — создание папок и файлов.
Источник