ошибка с помощью mv для переименования файлов в сценарии оболочки [duplicate]

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

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

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

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

95
задан 15 June 2014 в 05:32

14 ответов

Я все время использую rename. Это довольно просто, но, надеюсь, вы знаете базовое регулярное выражение:

rename "s/SEARCH/REPLACE/g" *

Это заменит строку SEARCH на REPLACE в каждом файле (то есть *). [F11] означает глобальный, поэтому, если у вас есть SEARCH_SEARCH.jpg, он будет переименован REPLACE_REPLACE.jpg. Если у вас не было /g, он выполнил бы только однократную замену и теперь назвал REPLACE_SEARCH.jpg. Если вы хотите нечувствительность к регистру, добавьте /i (это будет /gi или /ig в конце).

С помощью регулярных выражений вы можете сделать намного больше.

Обратите внимание, что это rename является командой prename (aka Perl rename), которая поддерживает полные регулярные выражения Perl. Существует еще один rename, который использует шаблоны и не настолько силен. prename устанавливается по умолчанию на Ubuntu (вместе с Perl).

Вот несколько примеров:

Префикс

Добавить:

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

Добавить :

Также вы можете удалить ненужные строки. Предположим, у вас было 20 файлов MP3, названных как CD RIP 01 Song.mp3, и вы хотели удалить часть «CD RIP», и вы хотели удалить их из всех них с помощью одной команды.

rename 's/^CD RIP //' * document.pdf переименован в MyPrefix_document.pdf

Обратите внимание на дополнительное пространство в '^CD RIP ', без пробела все файлы будут иметь пробел в качестве первого символа файла. Также обратите внимание: это будет работать без символа ^, но будет соответствовать CD RIP  в любой части имени файла. [F32] гарантирует, что он удаляет только символы, если они являются началом файла.

Суффикс

Добавить:

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

Добавить :

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

изменит Something.pdf на Something.doc. (Причина обратной косой черты: . является символом подстановки в regexp, поэтому .pdf соответствует qPDF, тогда как \.pdf соответствует только точной строке .pdf. Также очень важно отметить, если вы не знакомы с BASH, вы должны поместить обратную косую черту в одиночные цитаты! Вы не можете пропустить кавычки или использовать двойные кавычки, или bash попытается их перевести. Для bash \. и "\." равно .. (Но двойные кавычки и обратные косые черты используется, например, «\ n» для новой строки, но поскольку "\." не является допустимой обратной escape-последовательностью, она переводится в .)

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

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

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

перечислит все изменения, которые он сделал бы , если бы вы не поставили флаг -n. Если он выглядит хорошо, нажмите «Вверх», чтобы вернуться назад, затем сотрите -n и нажмите «Ввод» (или замените его на -v, чтобы вывести все его изменения).

170
ответ дан 18 July 2018 в 10:08

Я все время использую rename. Это довольно просто, но, надеюсь, вы знаете базовое регулярное выражение:

rename "s/SEARCH/REPLACE/g" *

Это заменит строку SEARCH на REPLACE в каждом файле (то есть *). [F11] означает глобальный, поэтому, если у вас есть SEARCH_SEARCH.jpg, он будет переименован REPLACE_REPLACE.jpg. Если у вас не было /g, он выполнил бы только однократную замену и теперь назвал REPLACE_SEARCH.jpg. Если вы хотите нечувствительность к регистру, добавьте /i (это будет /gi или /ig в конце).

С помощью регулярных выражений вы можете сделать намного больше.

Обратите внимание, что это rename является командой prename (aka Perl rename), которая поддерживает полные регулярные выражения Perl. Существует еще один rename, который использует шаблоны и не настолько силен. prename устанавливается по умолчанию на Ubuntu (вместе с Perl).

Вот несколько примеров:

Префикс

Добавить:

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

Добавить :

Также вы можете удалить ненужные строки. Предположим, у вас было 20 файлов MP3, названных как CD RIP 01 Song.mp3, и вы хотели удалить часть «CD RIP», и вы хотели удалить их из всех них с помощью одной команды.

rename 's/^CD RIP //' * document.pdf переименован в MyPrefix_document.pdf

Обратите внимание на дополнительное пространство в '^CD RIP ', без пробела все файлы будут иметь пробел в качестве первого символа файла. Также обратите внимание: это будет работать без символа ^, но будет соответствовать CD RIP  в любой части имени файла. [F32] гарантирует, что он удаляет только символы, если они являются началом файла.

Суффикс

Добавить:

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

Добавить :

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

изменит Something.pdf на Something.doc. (Причина обратной косой черты: . является символом подстановки в regexp, поэтому .pdf соответствует qPDF, тогда как \.pdf соответствует только точной строке .pdf. Также очень важно отметить, если вы не знакомы с BASH, вы должны поместить обратную косую черту в одиночные цитаты! Вы не можете пропустить кавычки или использовать двойные кавычки, или bash попытается их перевести. Для bash \. и "\." равно .. (Но двойные кавычки и обратные косые черты используется, например, «\ n» для новой строки, но поскольку "\." не является допустимой обратной escape-последовательностью, она переводится в .)

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

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

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

перечислит все изменения, которые он сделал бы , если бы вы не поставили флаг -n. Если он выглядит хорошо, нажмите «Вверх», чтобы вернуться назад, затем сотрите -n и нажмите «Ввод» (или замените его на -v, чтобы вывести все его изменения).

170
ответ дан 24 July 2018 в 19:31

Я использую krename. Это графическое приложение.

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

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

2
ответ дан 18 July 2018 в 10:08

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

qmv - удобный инструмент из пакета renameutils. Это позволяет вам использовать ваш любимый текстовый редактор для переименования файлов. В сочетании с мощью vim у вас отличная утилита для переименования.

Обычно я вызываю ее как qmv -f do в каталоге, где я хочу переименовать кучу файлов. Если я хочу переименовать рекурсивно qmv -R -f do.

Всякий раз, когда мне нужно переименовывать несколько файлов, я всегда возвращаюсь к qmv (и vim).

How может переименовать много файлов одновременно?

7
ответ дан 18 July 2018 в 10:08

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

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 не так уж хорош, но это только я.)

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

8
ответ дан 18 July 2018 в 10:08

Если единственным подходящим вариантом является переименование файлов вручную, отличный способ сделать это - использовать vidir (в пакете moreutils):

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:

vidir

. ├── 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 и O + X:

. ├── 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, удалите строки, содержащие файлы, которые вы хотите удалить; O + O и CTRL + X :

. └── baz
3
ответ дан 18 July 2018 в 10:08

Попробуйте pyrenamer.

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

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

21
ответ дан 18 July 2018 в 10:08

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

7
ответ дан 18 July 2018 в 10:08

Я использую krename. Это графическое приложение.

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

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

2
ответ дан 24 July 2018 в 19:31

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

qmv - удобный инструмент из пакета renameutils. Это позволяет вам использовать ваш любимый текстовый редактор для переименования файлов. В сочетании с мощью vim у вас отличная утилита для переименования.

Обычно я вызываю ее как qmv -f do в каталоге, где я хочу переименовать кучу файлов. Если я хочу переименовать рекурсивно qmv -R -f do.

Всякий раз, когда мне нужно переименовывать несколько файлов, я всегда возвращаюсь к qmv (и vim).

How может переименовать много файлов одновременно?

7
ответ дан 24 July 2018 в 19:31
  • 1
    Я просто попробовал это на основе вашего предложения. Это действительно самый удивительный инструмент, если вы используете vim! – ste_kwr 14 August 2014 в 05:07

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

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 не так уж хорош, но это только я.)

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

8
ответ дан 24 July 2018 в 19:31

Если единственным подходящим вариантом является переименование файлов вручную, отличный способ сделать это - использовать vidir (в пакете moreutils):

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:

vidir

. ├── 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 и O + X:

. ├── 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, удалите строки, содержащие файлы, которые вы хотите удалить; O + O и CTRL + X :

. └── baz
3
ответ дан 24 July 2018 в 19:31

Попробуйте pyrenamer.

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

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

21
ответ дан 24 July 2018 в 19:31
  • 1
    спасибо за упоминание функциональности Thunar. Если у вас есть Thunar - выберите файлы в папке и нажмите F2. – Max 8 August 2015 в 08:54

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

7
ответ дан 24 July 2018 в 19:31
  • 1
    Это не одно и то же: для продолжения переименования вам понадобится ENTER, клавиша со стрелкой для перехода к следующему файлу и F2, чтобы переименовать его. TAB делает это за один шаг после переименования файла. – MestreLion 30 August 2011 в 23:25
  • 2
    @MestreLion Но это очень похоже на алгоритм, описанный в вопросе, и не требует ни дополнительного программного обеспечения, ни операций с командной строкой. Удобство использования. – Rafał Cieślak 31 August 2011 в 00:31
  • 3
    Правда, вы были единственным ответом, что по крайней мере попробовал тот же подход, что и исходный вопрос. И печальная правда заключается в том, что Наутилус не обладает такой функциональностью. Вы можете переименовать F2, но это он. Нет TAB, чтобы автоматически перейти к следующему файлу в режиме переименования. – MestreLion 31 August 2011 в 10:18

Другие вопросы по тегам:

Похожие вопросы: