Переименуйте все файлы в папке с префиксом "Unix_"
Предположим, в папке есть два файла
a.txt
b.pdf
то они оба должны быть переименованы из одной команды в
Unix_a.txt
Unix_b.pdf
Переименуйте все файлы в папке с префиксом "Unix_"
Предположим, в папке есть два файла
a.txt
b.pdf
то они оба должны быть переименованы из одной команды в
Unix_a.txt
Unix_b.pdf
Ответы:
Если ваши имена файлов не содержат пробелов и у вас нет подкаталогов, вы можете использовать простой for
цикл:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
В противном случае используйте удобную rename
команду (которая является сценарием perl) - хотя она может быть недоступна из коробки в каждом Unix (например, OS X не поставляется с rename
).
Краткий обзор на debian-administration.org:
Если ваши имена файлов содержат пробелы, их проще использовать 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
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
ловить только файлы (без подкаталогов, ссылок и т. Д.) ...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
работает правильно независимо от того, какие символы находятся в именах файлов. Он также перемещает каталоги, сокеты, символические ссылки и другие типы файлов; Я полагаю, это не имеет значения.
.
перед всеми моими файлами
Попробуйте выполнить rename
команду в папке с файлами :
rename 's/^/Unix_/' *
Аргумент переименования ( команда sed s ) указывает на замену регулярного выражения ^ на Unix_ . Каретка (^) - это специальный символ, обозначающий начало строки .
's/^/.../'
значит?
's/^/.../'
- это аргумент выражения perl для команды переименования
rename 's/^start_/run_' *
Я думаю, это именно то, что вы ищете:
ls | xargs -I {} mv {} Unix_{}
Да, он простой, но элегантный и мощный, а также однострочный. Вы можете получить более подробное вступление от меня на странице: Переименовать файлы и каталоги (добавить префикс)
ls
- это может привести к проблемам, если в именах файлов есть пробелы или другие странные символы.
Недавно я столкнулся с такой же ситуацией и нашел более простое встроенное решение. Я делюсь этим здесь, чтобы он мог помочь другим людям, ищущим решение.
В OS X Yosemite Apple интегрировала возможности пакетного переименования непосредственно в Finder. Подробная информация доступна здесь . Я также скопировал шаги ниже,
Переименовать несколько элементов
Выберите элементы, затем щелкните один из них, удерживая нажатой клавишу Control.
В контекстном меню выберите «Переименовать элементы».
Во всплывающем меню под заголовком «Переименовать элементы папки» выберите замену текста в именах, добавление текста к именам или изменение формата имени.
Заменить текст: введите текст, который вы хотите удалить, в поле «Найти», затем введите текст, который вы хотите добавить, в поле «Заменить на».
Добавить текст: введите текст, который вы хотите добавить, в поле, затем выберите добавление текста до или после текущего имени.
Формат: выберите формат имени для файлов, а затем выберите указатель, счетчик или дату до или после имени. Введите имя в поле «Пользовательский формат», а затем введите номер, с которого хотите начать.
Щелкните "Переименовать".
Если у вас есть общий шаблон в ваших файлах, вы можете использовать Заменить текст, в противном случае Добавить текст также будет работать.
Вы можете просто использовать -i
вместо-I {}
ls | xargs -i mv {} unix_{}
Это тоже отлично работает.
ls
- перечисляет все файлы в каталогеxargs
- принимает все файлы построчно из-за -i
опции{}
- это заполнитель для всех файлов, необходим, если xargs
на вход поступает более двух аргументовИспользуя awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
устарело, теперь просто-I
Также работает для элементов с пробелами и игнорирует каталоги
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
С помощью rnm (вам нужно будет его установить):
rnm -ns 'Unix_/fn/' *
Или
rnm -rs '/^/Unix_/' *
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
Это переименовывает файлы и каталоги с регулярным выражением, затрагивающим только базовые имена.
Итак, для префикса вы можете:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
или только для файлов:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
first cd
s в каталог перед выполнением только для базового имени.
Я объяснил это более подробно на странице: Найдите несколько файлов и переименуйте их в Linux.