Перейменуйте всі файли в папці з префіксом в одній команді


86

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

Припустимо, у папці є два файли

a.txt
b.pdf

тоді їх обох слід перейменувати з однієї команди на

Unix_a.txt
Unix_b.pdf


перевірити тут: 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_/' *

Аргумент rename ( команда s s ) вказує на заміну регулярного виразу ^ на Unix_ . Каретка (^) - це спеціальний символ, що означає початок рядка .


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

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

Це круто! я б запропонував додати папку / *, оскільки * трохи небезпечно, якщо команда випадково повториться в іншому місці
Systems Rebooter

brew install rename @OliverPearmain
Felipe Plazas

Приклад заміни префікса:rename 's/^start_/run_' *
DenisKolodin

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: Я не вважаю це необхідною інформацією. Якщо хтось хоче знайти автора, це досить просто.
Джахід

Дякуємо за цей інструмент. З якоїсь причини 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/*

Що це означає:

`перейменувати" ШЛЯХ / НЕЩЕ / НЕЩЕ_ЕЩЕ "ШЛЯХ / ФАЙЛИ

Порада:

Якщо ви вже на шляху, запустіть його так:

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_/' '{}' \;

-execdir спочатку cd s в каталог, перш ніж виконувати лише базове ім'я.

Я пояснив це більш докладно в: Знайдіть кілька файлів і перейменуйте їх у Linux

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.