Переименовать все файлы в папке с префиксом одной командой


86

Переименуйте все файлы в папке с префиксом "Unix_"

Предположим, в папке есть два файла

a.txt
b.pdf

то они оба должны быть переименованы из одной команды в

Unix_a.txt
Unix_b.pdf

1
проверьте эту ссылку => cyberciti.biz/tips/…
red eyes dev

проверьте здесь: theunixshell.blogspot.com/2013/01/…
Виджай,

Ответы:


107

Если ваши имена файлов не содержат пробелов и у вас нет подкаталогов, вы можете использовать простой 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

@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_ . Каретка (^) - это специальный символ, обозначающий начало строки .


8
Не могли бы вы объяснить, что 's/^/.../'значит?
mcont

@Matteo 's/^/.../'- это аргумент выражения perl для команды переименования
RoyalleBlue

это круто! Я бы посоветовал добавить папку / *, потому что * немного опасно, если команда случайно будет повторена в другом месте
Systems Rebooter

варить установку переименовать @OliverPearmain
Фелипе

Пример замены приставки:rename 's/^start_/run_' *
Денис Колодин

35

Я думаю, это именно то, что вы ищете:

ls | xargs -I {} mv {} Unix_{}

Да, он простой, но элегантный и мощный, а также однострочный. Вы можете получить более подробное вступление от меня на странице: Переименовать файлы и каталоги (добавить префикс)


2
Остерегайтесь обработки вывода ls- это может привести к проблемам, если в именах файлов есть пробелы или другие странные символы.
Джонатан Леффлер

15

Недавно я столкнулся с такой же ситуацией и нашел более простое встроенное решение. Я делюсь этим здесь, чтобы он мог помочь другим людям, ищущим решение.

В OS X Yosemite Apple интегрировала возможности пакетного переименования непосредственно в Finder. Подробная информация доступна здесь . Я также скопировал шаги ниже,

Переименовать несколько элементов

  1. Выберите элементы, затем щелкните один из них, удерживая нажатой клавишу Control.

  2. В контекстном меню выберите «Переименовать элементы».

  3. Во всплывающем меню под заголовком «Переименовать элементы папки» выберите замену текста в именах, добавление текста к именам или изменение формата имени.

    • Заменить текст: введите текст, который вы хотите удалить, в поле «Найти», затем введите текст, который вы хотите добавить, в поле «Заменить на».

    • Добавить текст: введите текст, который вы хотите добавить, в поле, затем выберите добавление текста до или после текущего имени.

    • Формат: выберите формат имени для файлов, а затем выберите указатель, счетчик или дату до или после имени. Введите имя в поле «Пользовательский формат», а затем введите номер, с которого хотите начать.

  4. Щелкните "Переименовать".

Если у вас есть общий шаблон в ваших файлах, вы можете использовать Заменить текст, в противном случае Добавить текст также будет работать.


Отлично - сэкономили много времени!
user3000868

6

Вы можете просто использовать -iвместо-I {}

ls | xargs -i mv {} unix_{}

Это тоже отлично работает.

  • ls - перечисляет все файлы в каталоге
  • xargs- принимает все файлы построчно из-за -iопции
  • {}- это заполнитель для всех файлов, необходим, если xargsна вход поступает более двух аргументов

Используя awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-iустарело, теперь просто-I
JamPow

это помогло мне в Debian 8. Спасибо
Аброр Эсоналиев

2

Также работает для элементов с пробелами и игнорирует каталоги

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

С помощью rnm (вам нужно будет его установить):

rnm -ns 'Unix_/fn/' *

Или

rnm -rs '/^/Unix_/' *

PS: я являюсь автором этого инструмента.


2
Вам следует просмотреть все свои ответы о своей утилите и добавить заявление об отказе от ответственности, что вы являетесь ее автором.
Mogsdad

@Mogsdad: Я не думаю, что это необходимая информация. Если кто-то хочет найти автора, это довольно просто.
Джахид

Спасибо за этот инструмент. У renameменя почему-то не работает, но rnmработает.
Aloso

0

Ситуация:

У нас 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/" *

Или, если вы хотите сделать это в любом подкаталоге, начинающемся с ssdo:

rename -n "s/certificat/certificate_old/" ./ss*/*

Вы также можете:

rename -n "s/certi*/certificate_old/" ./ss*/*

Это переименовывает все, что начинается с, certiв любом подкаталоге, начинающемся с ss.

Небо это предел.

Поиграйте с регулярным выражением и ВСЕГДА проверяйте это ПЕРЕД с помощью -n.

СМОТРЕТЬ, ЭТО ДАЖЕ ПЕРЕИМЕНОВАТЬ ИМЕНА ПАПКИ, СООТВЕТСТВУЮЩИЕ Лучше cdв каталог и сделай там. ИСПОЛЬЗУЙТЕ НА СОБСТВЕННЫЙ РИСК.


0

find -execdir rename

Это переименовывает файлы и каталоги с регулярным выражением, затрагивающим только базовые имена.

Итак, для префикса вы можете:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

или только для файлов:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdirfirst cds в каталог перед выполнением только для базового имени.

Я объяснил это более подробно на странице: Найдите несколько файлов и переименуйте их в Linux.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.