Як легко перейменувати кілька файлів за допомогою командного рядка?


103

Одним із способів швидкого перейменування файлів у Windows є

F2 > Rename > Tab (to next file) > Rename ...

Але в Ubuntu / Nautilus я не можу вкласти в наступний файл. Але, перебуваючи в Linux, я думаю, що повинна бути альтернатива командного рядка.

Однак іноді, можливо, я хочу більше контролювати, як перейменувати конкретні файли. У такому випадку, можливо, краще мати можливість перейти до наступного файлу


1
Чи можете ви визначити "більше контролю"? Не впевнений, про що ви точно питаєте ..
Данг Хоа,

Я думаю, на це питання не відповіли. Те, що ви просите (F2, а потім перейдіть у режимі F2 до наступного файлу), наразі недоступне, я думаю, у Nautilus.
don.joey

Відповіді:


187

Я renameвесь час користуюся . Це досить просто, але, сподіваємось, ви знаєте базовий регулярний вираз:

rename "s/SEARCH/REPLACE/g"  *

Це замінить рядок SEARCHз REPLACEв кожному файлі (тобто *). В /gозначає глобальний, так що якщо у вас була SEARCH_SEARCH.jpg, вона буде перейменована REPLACE_REPLACE.jpg. Якби у вас цього не було /g, він би здійснив заміну лише один раз, і таким чином тепер був названий REPLACE_SEARCH.jpg. Якщо ви хочете без регістру, додайте /i(це було б, /giабо /igв кінці).

За допомогою регулярних виразів ви можете зробити набагато більше.

Зауважте, що це renameкоманда prename(aka Perl rename), яка підтримує повні регулярні вирази Perl. Є ще одна, renameяка використовує шаблони, і не настільки потужна. prenameраніше встановлювався за замовчуванням на Ubuntu (разом з Perl), але тепер, можливо, доведеться зробити:

sudo apt install rename

Ось кілька прикладів:

Префікс

Додати :

rename 's/^/MyPrefix_/' * 
  • document.pdf перейменований на MyPrefix_document.pdf

Видалити :

Також ви можете видалити небажані рядки. Скажімо, у вас було 20 MP3-файлів з назвою типу, CD RIP 01 Song.mp3і ви хотіли видалити частину "CD RIP", і ви хотіли видалити це з усіх них однією командою.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 до 01 Song.mp3

Зверніть увагу на додатковий простір у '^CD RIP ', без простору всі файли мали б пробіл як перший символ файлу. Також зауважте, що це буде працювати без ^символу, але відповідатиме CD RIP будь-якій частині імені файлу. У ^гарантує , що тільки видаляє символи , якщо вони є початком файлу.

Суфікс

Додати :

rename 's/$/_MySuffix/' *
  • document.pdf перейменований на document.pdf_MySuffix

Змінити :

rename 's/\.pdf$/.doc/' *

зміниться Something.pdfв Something.doc. (Причина зворотної косої риси полягає .в тому, що символом підстановки в регулярному виразі є .pdfзбіг, qPDFтоді як \.pdfзбігається лише точний рядок .pdf. Також дуже важливо зауважити, якщо ви не знайомі з BASH, ви повинні ставити зворотні косої риски в SINGLE лапки! Ви не можете опускати цитати або використовувати подвійні лапки, або bash намагатиметься їх перекласти. У bash \. і "\." equals .. (Але використовуються подвійні лапки та зворотні косої риси, наприклад, "\ n" для нового рядка, але оскільки "\."це не дійсна зворотна послідовність втечі, це перекладається на .)

Насправді ви навіть можете вкласти частини рядка в лапки замість цілого: 's/Search/Replace/g'це те саме, що s/'Search'/'Replace'/gі s/Search/Replace/gв BASH. Ви просто повинні бути обережними щодо спеціальних символів (і пробілів).


Я пропоную використовувати -nваріант, коли ви не позитивні, у вас є правильні регулярні вирази. Він показує, що було б перейменовано, а потім виходить, не роблячи цього. Наприклад:

rename -n s/'One'/'Two'/g *

Тут буде перераховано всі зміни, які він був би внесений, якби ви не поставили -nпрапор туди. Якщо це добре виглядає, натисніть, Upщоб повернутися назад, а потім стерти -nта натисніть Enter(або замініть його, -vщоб вивести всі внесені зміни).

Примітка : Версії Ubuntu вище 17.04 не постачаються renameза замовчуванням, однак вони все ще доступні у сховищах. Використовуйте sudo apt install renameдля його встановлення


Як у мене з’явиться «динамічний» суфікс. Як 001 - 010 тощо. Можливо?
Jiew Meng

Хм .. Я намагався щось написати, але нічого не вийшло. Переважно тому, що коли я додаю 1 до 001, він додає до 2, а не до 002. Інакше я міг би просто використати змінну, щоб утримувати позицію числа, а потім додати її. Крім того, я просто згадав, перш ніж я дізнався про renameзаклик, ось що я зробив, щоб додати:for f in *; do mv -v "$f" "prependThis$f"; done
Метт

2
@jiewmeng Так. Використовуйте (?:\.[0-9]{3})$у своєму шаблоні, він відповідатиме всім тризначним розширенням файлів у пасивній групі. Приклад: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Подивіться на цю шпаргалку з регулярними виразками .
sergio91pt

@ sergio91pt це хороший чіт-лист із регулярними регексами. Але про що йдеться? Повинно бути perl - але не можна знайти такої записки там.
Adobe

@Adobe Це загальний варіант для "пергекс на основі". Подивіться на примітку про знак + та стовпець про класи символів POSIX.
sergio91pt

21

Спробуйте піренамер .

Він не інтегрований з nautilus, але він робить роботу. Ось огляд.

Thunar (частина XFCE) також має перейменувач, який можна запускати окремо.

Тунар об'ємний перейменувач


2
Дякуємо, що згадали про функціональність Thunar. Якщо у вас є Thunar - виберіть файли у папці та натисніть F2.
Макс

9

Схоже, існує проект на стартовій панелі під назвою nautilus-renamer . Ви можете встановити його, запустивши, make installяк тільки ви завантажите скрипт і зніміть його. Здається, він має деякі функціональні можливості, або якщо ви дійсно знаєте, якесь програмування може бути, ви можете просто підсилити його під свої потреби, оскільки це просто сценарій пітона.

введіть тут опис зображення


8

У командному рядку перейменувати один файл команда просто

mv file1.txt file2.txt

Якщо ви хочете зробити це пакетно, ви, ймовірно, захочете це зробити за допомогою сценарію. Якщо ви надасте більше деталей, я, чи хтось інший, ймовірно, може підняти вас. При цьому сценарій для додавання матеріалу до файлу може виглядати так:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

Залежно від того, як саме вам потрібні речі, перейменовані, це, швидше за все, буде налаштовано, наприклад, якщо у вас є конкретні правила перейменування, яких слід дотримуватися. (Особисто я б це робив за допомогою сценарію Perl, оскільки мій баш-фуо не такий великий, але це тільки я.)

Зауважте, що я отримав відокремлення імені файлу та розширення від раніше заданого питання .


7

Якщо ви хочете зробити це без командного рядка, аналогічно тому, що ви робили в Windows, використовуйте клавішу зі стрілкою праворуч замість клавіші вкладки . Це дозволить вибрати наступний файл, як і вкладка в Windows.


Це не те саме: вам все одно знадобиться ENTER для завершення перейменування, клавіша зі стрілкою для переходу до наступного файлу та F2 для перейменування. TAB робить це за 1 крок, як тільки ви перейменуєте файл.
MestreLion

@MestreLion Але він дуже схожий на алгоритм, описаний у питанні, і не вимагає ані додаткового програмного забезпечення, ані операцій командного рядка. Начебто зручні для користувачів.
Rafał Cieślak

Правда, ви були єдиною відповіддю, яка хоча б спробувала той самий підхід, що і вихідне питання. І сумна правда полягає в тому, що Наутілус не має такої функціональності. Ви можете перейменувати F2, але це все. Немає TAB, щоб автоматично перейти до наступного файлу в режимі перейменування.
MestreLion

7

Насправді не те саме питання, як як перейменувати багато файлів одночасно? але я запропоную ту саму програму, яку я запропонував у цій відповіді: qmv .

qmv - це зручний інструмент із пакета перейменування. Це дозволяє використовувати улюблений текстовий редактор для перейменування файлів. У поєднанні з силою vim ви маєте чудову корисну програму перейменування.

Я, як правило, викликаю це, як qmv -f doу режимі, де я хочу перейменувати купу файлів. Або якщо я хочу перейменувати рекурсивно qmv -R -f do.

Щоразу, коли у мене виникає необхідність перейменувати кілька файлів, я завжди потрапляю на qmv (і vim).

http://www.nongnu.org/renameutils/


Я просто спробував це на основі вашої пропозиції. Це справді найдивовижніший інструмент, якщо ви використовуєте vim!
ste_kwr

3

Якщо єдиним підходящим варіантом є перейменування файлів вручну, відмінний спосіб зробити це за допомогою vidirmoreutilsпакеті):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Приклади


Перейменування файлів вибірково

Вміст поточного робочого каталогу:

.
├── bar
├── baz
└── foo

Виконати vidir, перейменувати назви файлів у рядках, що містять імена файлів, які ви хочете перейменувати; натисніть CTRL+ Oі CTRL+ X:

скріншот3

.
├── bar.bak
├── baz.old
└── foo.new

Перемикання назви файлів вибірково

Вміст поточного робочого каталогу:

.
├── bar
├── baz
└── foo

Вміст файлів поточного робочого каталогу:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Виконати vidir, переключити числа в рядках, що містять імена файлів, які ви хочете переключити; натисніть CTRL+ Oі CTRL+ X:

скріншот4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Видалення файлів вибірково

Вміст поточного робочого каталогу:

.
├── bar
├── baz
└── foo

Виконати vidir, видалити рядки, що містять файли, які потрібно видалити; натисніть CTRL+ Oі CTRL+ X:

скріншот2

.
└── baz

2

Я використовую krename. Це додаток GUI. Тут можна було читати mp3-теги тощо.

Він існує як окремий додаток, так і частина Krusader.

Існує також renameсценарій, який є частиною стандартної установки Perl (напевно, у вас це встановлено). Перевірте це за допомогою man rename.

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