Если ваши имена файлов не содержат пробелов и у вас нет подкаталогов, вы можете использовать простой forцикл:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
В противном случае используйте удобную renameкоманду (которая является сценарием perl) - хотя она может быть недоступна из коробки в каждом Unix (например, OS X не поставляется с rename).
Если ваши имена файлов содержат пробелы, их проще использовать find, в Linux должно работать следующее:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
В системах BSD -printf, к сожалению , такой возможности нет . Но GNU findutils должен быть установлен (например, на Mac OS X с brew install findutils).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
@Matteo: Спасибо за подсказку: обновил свой ответ с предупреждением и двумя примерами с find.
miku
Также рекомендую for f in *; do [[ -f ${f} ]] && mv ...; doneловить только файлы (без подкаталогов, ссылок и т. Д.) ...
twalberg
1
Если вы укажете переменные в кавычках, как следует, то for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; doneработает правильно независимо от того, какие символы находятся в именах файлов. Он также перемещает каталоги, сокеты, символические ссылки и другие типы файлов; Я полагаю, это не имеет значения.
Джонатан Леффлер
Каким-то образом это добавило .перед всеми моими файлами
обнуляемость
75
Попробуйте выполнить renameкоманду в папке с файлами :
rename 's/^/Unix_/' *
Аргумент переименования ( команда sed s ) указывает на замену регулярного выражения ^ на Unix_ . Каретка (^) - это специальный символ, обозначающий начало строки .
Остерегайтесь обработки вывода ls- это может привести к проблемам, если в именах файлов есть пробелы или другие странные символы.
Джонатан Леффлер
15
Недавно я столкнулся с такой же ситуацией и нашел более простое встроенное решение. Я делюсь этим здесь, чтобы он мог помочь другим людям, ищущим решение.
В OS X Yosemite Apple интегрировала возможности пакетного переименования непосредственно в Finder. Подробная информация доступна здесь . Я также скопировал шаги ниже,
Переименовать несколько элементов
Выберите элементы, затем щелкните один из них, удерживая нажатой клавишу Control.
В контекстном меню выберите «Переименовать элементы».
Во всплывающем меню под заголовком «Переименовать элементы папки» выберите замену текста в именах, добавление текста к именам или изменение формата имени.
Заменить текст: введите текст, который вы хотите удалить, в поле «Найти», затем введите текст, который вы хотите добавить, в поле «Заменить на».
Добавить текст: введите текст, который вы хотите добавить, в поле, затем выберите добавление текста до или после текущего имени.
Формат: выберите формат имени для файлов, а затем выберите указатель, счетчик или дату до или после имени. Введите имя в поле «Пользовательский формат», а затем введите номер, с которого хотите начать.
Щелкните "Переименовать".
Если у вас есть общий шаблон в ваших файлах, вы можете использовать Заменить текст, в противном случае Добавить текст также будет работать.
Ответы:
Если ваши имена файлов не содержат пробелов и у вас нет подкаталогов, вы можете использовать простой
for
цикл:В противном случае используйте удобную
rename
команду (которая является сценарием perl) - хотя она может быть недоступна из коробки в каждом Unix (например, OS X не поставляется сrename
).Краткий обзор на debian-administration.org:
Если ваши имена файлов содержат пробелы, их проще использовать
find
, в Linux должно работать следующее:В системах BSD
-printf
, к сожалению , такой возможности нет . Но GNU findutils должен быть установлен (например, на Mac OS X сbrew install findutils
).источник
find
.for f in *; do [[ -f ${f} ]] && mv ...; done
ловить только файлы (без подкаталогов, ссылок и т. Д.) ...for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
работает правильно независимо от того, какие символы находятся в именах файлов. Он также перемещает каталоги, сокеты, символические ссылки и другие типы файлов; Я полагаю, это не имеет значения..
перед всеми моими файламиПопробуйте выполнить
rename
команду в папке с файлами :Аргумент переименования ( команда sed s ) указывает на замену регулярного выражения ^ на Unix_ . Каретка (^) - это специальный символ, обозначающий начало строки .
источник
's/^/.../'
значит?'s/^/.../'
- это аргумент выражения perl для команды переименованияrename 's/^start_/run_' *
Я думаю, это именно то, что вы ищете:
Да, он простой, но элегантный и мощный, а также однострочный. Вы можете получить более подробное вступление от меня на странице: Переименовать файлы и каталоги (добавить префикс)
источник
ls
- это может привести к проблемам, если в именах файлов есть пробелы или другие странные символы.Недавно я столкнулся с такой же ситуацией и нашел более простое встроенное решение. Я делюсь этим здесь, чтобы он мог помочь другим людям, ищущим решение.
В OS X Yosemite Apple интегрировала возможности пакетного переименования непосредственно в Finder. Подробная информация доступна здесь . Я также скопировал шаги ниже,
Переименовать несколько элементов
Выберите элементы, затем щелкните один из них, удерживая нажатой клавишу Control.
В контекстном меню выберите «Переименовать элементы».
Во всплывающем меню под заголовком «Переименовать элементы папки» выберите замену текста в именах, добавление текста к именам или изменение формата имени.
Заменить текст: введите текст, который вы хотите удалить, в поле «Найти», затем введите текст, который вы хотите добавить, в поле «Заменить на».
Добавить текст: введите текст, который вы хотите добавить, в поле, затем выберите добавление текста до или после текущего имени.
Формат: выберите формат имени для файлов, а затем выберите указатель, счетчик или дату до или после имени. Введите имя в поле «Пользовательский формат», а затем введите номер, с которого хотите начать.
Щелкните "Переименовать".
Если у вас есть общий шаблон в ваших файлах, вы можете использовать Заменить текст, в противном случае Добавить текст также будет работать.
источник
Вы можете просто использовать
-i
вместо-I {}
Это тоже отлично работает.
ls
- перечисляет все файлы в каталогеxargs
- принимает все файлы построчно из-за-i
опции{}
- это заполнитель для всех файлов, необходим, еслиxargs
на вход поступает более двух аргументовИспользуя awk:
источник
-i
устарело, теперь просто-I
Также работает для элементов с пробелами и игнорирует каталоги
источник
С помощью rnm (вам нужно будет его установить):
Или
PS: я являюсь автором этого инструмента.
источник
rename
меня почему-то не работает, ноrnm
работает.Ситуация:
У нас
certificate.key
certificate.crt
внутри/user/ssl/
Мы хотим переименовать все, что начинается с,
certificate
вcertificate_OLD
Мы сейчас находимся внутри
/user
Сначала вы выполняете пробный прогон с
-n
:rename -n "s/certificate/certificate_old/" ./ssl/*
Что возвращает:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
Ваши файлы останутся без изменений, это всего лишь пробный запуск.
Решение:
Когда вы довольны результатом теста, запустите его по-настоящему:
rename "s/certificate/certificate_OLD/" ./ssl/*
Что это означает:
`переименовать" s / SOMETHING / SOMETING_ELSE "PATH / FILES
Наконечник:
Если вы уже на пути, запустите его так:
rename "s/certificate/certificate_OLD/" *
Или, если вы хотите сделать это в любом подкаталоге, начинающемся с
ss
do:rename -n "s/certificat/certificate_old/" ./ss*/*
Вы также можете:
rename -n "s/certi*/certificate_old/" ./ss*/*
Это переименовывает все, что начинается с,
certi
в любом подкаталоге, начинающемся сss
.Небо это предел.
Поиграйте с регулярным выражением и ВСЕГДА проверяйте это ПЕРЕД с помощью
-n
.СМОТРЕТЬ, ЭТО ДАЖЕ ПЕРЕИМЕНОВАТЬ ИМЕНА ПАПКИ, СООТВЕТСТВУЮЩИЕ Лучше
cd
в каталог и сделай там. ИСПОЛЬЗУЙТЕ НА СОБСТВЕННЫЙ РИСК.источник
find -execdir rename
Это переименовывает файлы и каталоги с регулярным выражением, затрагивающим только базовые имена.
Итак, для префикса вы можете:
или только для файлов:
-execdir
firstcd
s в каталог перед выполнением только для базового имени.Я объяснил это более подробно на странице: Найдите несколько файлов и переименуйте их в Linux.
источник