Переименуйте все файлы в папке с префиксом в одной команде unix - PullRequest
71 голосов
/ 13 июня 2011

Переименуйте все файлы в папке с префиксом «Unix_», т. Е. Предположим, что в папке есть два файла a.txt и b.pdf, затем они оба должны быть переименованы из одной команды в Unix_a.txt и Unix_b.pdf

Ответы [ 8 ]

89 голосов
/ 13 июня 2011

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

Попробуйте команду rename в папке с файлами :

rename 's/^/Unix_/' *

Аргумент переименования ( команда sed ) указывает на замену регулярного выражения ^ на Unix_ . Символ каретки (^) - это специальный символ, который означает начало строки .

25 голосов
/ 07 декабря 2012

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

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

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

9 голосов
/ 19 января 2016

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

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

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

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

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

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

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

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

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

  4. Нажмите Переименовать.

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

5 голосов
/ 18 мая 2016

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

ls | xargs -i mv {} unix_{}

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

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

Использование awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
1 голос
/ 07 мая 2016

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

rnm -ns 'Unix_/fn/' *

Или

rnm -rs '/^/Unix_/' *

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

1 голос
/ 29 мая 2015

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

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
0 голосов
/ 03 июня 2018

Ситуация:

У нас есть 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 в каталог и сделай это там.ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК.

...