Как мне легко переименовать несколько файлов с помощью командной строки?

103

Одним из способов быстрого переименования файлов в Windows является

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

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

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

Jiew Meng
источник
1
Не могли бы вы определить «больше контроля»? Не уверен, что именно вы спрашиваете ..
Dang Khoa
Я думаю, что на этот вопрос нет ответа. То, что вы просите (F2, а затем перейти в режиме F2 к следующему файлу), в настоящее время недоступно, я думаю, в Nautilus.
don.joey

Ответы:

189

Я использую 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, вы должны ставить обратную косую черту в одиночных кавычках! Вы не можете опускать кавычки или используйте двойные кавычки, или bash попытается перевести их. Для bash \. и "\." равно .. (Но используются двойные кавычки и обратные слеши, например, "\ n" для новой строки, но так "\."как не является допустимой обратной escape-последовательностью, она переводится в .)

На самом деле, вы можете даже заключить части строки в кавычки вместо целых: '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для установки

Matt
источник
Как у меня будет "динамический" суффикс. Как 001 - 010 и т. Д. Возможно?
Jiew Meng
Хм .. Я пытался что-то написать, но это не сработало. Главным образом потому, что, когда я добавляю 1 к 001, это добавляет к 2, а не к 002. В противном случае, я мог бы просто использовать переменные, чтобы сохранить числовую позицию, а затем добавить ее. Кроме того, я только что вспомнил, прежде чем я знал о renameкоманде, это то, что я сделал, чтобы добавить:for f in *; do mv -v "$f" "prependThis$f"; done
Мэтт
2
@jiewmeng Да. Используйте (?:\.[0-9]{3})$в своем шаблоне, он будет соответствовать всем 3-значным расширениям файлов в пассивной группе. Пример: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Взгляните на этот шпаргалку регулярных выражений .
sergio91pt
@ sergio91pt это хороший чит-лист для регулярных выражений. Но о чем это? Должно быть, Perl - но я не могу найти такую ​​записку там.
Adobe
@Adobe Это общий термин для регулярных выражений на основе Perl. Посмотрите на примечание о знаке + и столбец о классах символов POSIX.
sergio91pt
21

Попробуй пиренамер .

Он не интегрирован с nautilus, но он выполняет свою работу. Вот обзор.

Thunar (часть XFCE) также имеет переименователь, который можно запускать отдельно.

Тунный переименователь

RolandiXor
источник
2
спасибо за упоминание функциональности Thunar. Если у вас есть Thunar - выберите файлы в папке и нажмите F2.
Макс
9

Кажется, на панели запуска есть проект, который называется nautilus-renamer . Вы можете установить его, запустив make installпосле того, как загрузите скрипт и распакуете его. Кажется, у него есть некоторые функциональные возможности, или, если вы знаете, что программирование может быть, вы можете просто улучшить его для своих нужд, так как это всего лишь скрипт на python.

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

sagarchalise
источник
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, поскольку мой bash-foo не так уж и хорош, но это только я.)

Обратите внимание, что я получил разделение имени файла и расширения от ранее заданного вопроса .

Данг Кхоа
источник
7

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

Рафал Цеслак
источник
Это не то же самое: вам все равно понадобится ENTER, чтобы закончить переименование, клавиша со стрелкой, чтобы перейти к следующему файлу, и F2, чтобы переименовать его. TAB делает это за 1 шаг после переименования файла.
МестреЛион
@MestreLion Но он очень похож на алгоритм, описанный в вопросе, и не требует ни дополнительного программного обеспечения, ни операций командной строки. Вроде того, чтобы быть удобным для пользователя.
Rafał Cieślak
Правда, вы были единственным ответом, который хотя бы попробовал тот же подход, что и исходный вопрос. И печальная правда в том, что у Наутилуса нет такой функциональности. Вы можете переименовать F2, но это так. Нет TAB для автоматического перехода к следующему файлу в режиме переименования уже.
MestreLion
7

Не совсем такой же вопрос, как Как переименовать много файлов одновременно? но я собираюсь предложить ту же программу, которую я предложил в этом ответе: qmv .

qmv - это удобный инструмент из пакета renameutils. Это позволяет вам использовать ваш любимый текстовый редактор для переименования файлов. В сочетании с мощью 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:

screenshot3

.
├── 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:

screenshot4

.
├── 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:

screenshot2

.
└── baz
кос
источник
2

Я использую кренаме. Это приложение с графическим интерфейсом. Он мог читать теги mp3 и так далее.

Он существует как отдельное приложение, а также как часть Krusader.

Также есть renameскрипт, который является частью стандартной установки perl (возможно, он установлен). Проверьте это с man rename.

саман
источник