Изменить несколько имен файлов, заменив символ


29

У меня есть несколько файлов, названных как that : screenshot 13:25.png
Windows из-за ":" изо всех сил пытается открыть эти файлы.

Как я могу заменить его?


2
Можете ли вы принять ответ, чтобы пометить вопрос как решенный? Это очень поможет другим пользователям.
— MERose

Ответы:


52

В терминале, cdв правильный каталог и затем запустите это.

rename 's/\:/-/g' *.png -vn

Это будет предварительный просмотр переименования. Следует заменить :на -.

Если это выглядит правильно, удалите nс конца, а затем он будет делать реальное переименование.

Примечание : версии Ubuntu выше 17.04 не поставляются с rename, но они все еще доступны в репозиториях по умолчанию, поэтому используйте sudo apt install renameдля их получения


Спасибо за ваш ответ. Я попытался, и у меня есть эта проблема: Шаблон замены не завершен в (eval 1) строке 1.
— user236152

@ user236152 Извините, я немного сошел с ума от убегающих обратных слешей (был на автопилоте!). Удалена пара и она должна быть действительна сейчас.
— Оли

Возможно, простой сценарий Nautilus, который заменяет все такие символы, которые могут вызвать проблемы на других платформах (работает на всех выбранных файлах), может быть полезен для «мультиплатформенных» людей.
— Сади

2
Зачем это использовать? Он показывает вам, что он делает (облегчает обращение, если вы допустили ошибку). Почему в конце? Просто, чтобы вы могли удалить его (или n) легко.
— Оли

1
@nightcrawler Вы должны быть в состоянии связать полностью отдельные замены:rename 's/\:/-/g; s/%28/ /g; s/%29//g' ...
— Оли

10

Вот чистое решение Bash:

for i in *:*; do
    mv "$i" "${i//:/_}"
done

${var//pattern/replacement}Формат заменит все вхождения patternс replacementв переменной $var. Для получения дополнительной информации о возможностях bash по отображению строк см. Здесь .

Если вы хотите сделать это для нескольких символов, вы можете просто поместить их в класс символов. Так, например, чтобы заменить все ;, :, =, +, %, ,с подчеркиванием, вы можете сделать:

$ ls 
1foo:bar  2foo:bar:baz  3foo;bar  4foo=bar  5foo%bar  6foo,bar  7foo+bar
$ for i in *; do mv "$i" "${i//[:;=%,+]/_}"; done
$ ls
1foo_bar  2foo_bar_baz  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar

По сути, идея в том, что это [ ]значит any of the characters listed. Таким образом, помещая все символы, которые вы хотите заменить, в класс символов, все они обрабатываются одновременно.


Для определенных символов, которые вы просили, все немного сложнее, потому что некоторые из них нужно экранировать (я игнорирую, /поскольку * nix не допускает его в именах файлов больше, чем Windows, так что это не будет выпуск):

$ ls
1foo<bar  2foo>bar  3foo:bar  4foo\bar  5foo|bar  6foo*bar  7foo?bar  8foo"bar  9foo'bar
$ for i in *; do mv "$i" "${i//[<>:\\|*\'\"?]/_}"; done
$ ls
1foo_bar  2foo_bar  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar  8foo_bar  9foo_bar

Обратите внимание, что я избежал \, 'и ", добавив \перед каждым.


Можно ли улучшить это, чтобы заменить несколько отдельных символов (например, всех, которые не приемлемы для Windows) другими?
— Сади

1
@ Сади см обновленный ответ.
— Тердон

Всего их девять: "<>:" / \ | ? * "
— Сади

@ Сади см обновленный ответ.
— тердон

Спасибо, это может помочь создать скрипт Nautilus, который делает имена выбранных файлов совместимыми с Windows.
— Сади

2

Если вы предпочитаете графический интерфейс, установите pyrenamer:

sudo apt-get install pyrenamer

Затем запустите это:

pyrenamer

Он имеет десятки вариантов шаблонов и форматов переименования.


1

Я предпочитаю GUI , но в качестве расширения Nautilus, т.е. Nautilus Действия Extra :

sudo add-apt-repository ppa:nae-team/ppa
sudo apt-get update
sudo apt-get install nautilus-actions-extra
nautilus -q

(См. Www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful.html )

Затем, когда вы выбираете файлы для переименования и нажимаете «Переименовать» в контекстном меню, вам предлагается множество вариантов переименования файлов.


0

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

В этом случае вы можете использовать qmv -f do *:*для редактирования имен всех файлов, содержащих двоеточие, а затем :%s/:/_/gкоманду в Vim (или соответствующий поиск и замену в любом редакторе, который вы используете).

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

С помощью qmvвы можете вместо этого выбрать конвейеризацию сгенерированного файла с помощью команды по вашему выбору, например sed, если вы не хотите интерактивные возможности.


0

А вот скрипт Nautilus, который заменяет (все?) Несовместимые с Windows символы дефисом во всех выбранных именах файлов (на основе ответа terdon ;-)

#!/bin/bash
filesall=""
while [ $# -gt 0 ]
    do
        files=`echo "$1" | sed 's/ /\?/g'`
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\\|*\'\"?]/-}"; done

0

Thunar (файловый менеджер XFCE) имеет хорошую встроенную функцию для массового переименования файлов. У него есть опции для удаления / замены символов, поиска и замены, нумерации файлов и многое другое.

Установить Thunar:

sudo apt-get install thunar

Откройте Thunar, перейдите к своим файлам, выберите их и выберите «переименовать» (через контекстное меню или F2)


0
@echo off
echo.
echo. How many Characters Do You Want To Remove
echo.
echo. From The End Of The FileName ?
echo.
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (
set oldName=%%a
Set newName=!oldName:~0,-%variable%!.mp3
Ren "!oldName!" "!newName!"
)
exit

Это хорошо работает и имеет переменную подсказку ... Назовите файл как-то как _ Truncate Last Characters.cmd
— TekWiz2010

3
Хотя это может быть правильным, в нем используется язык пакетных сценариев Windows. Мы на AskUbuntu, сайте для вопросов, связанных с Ubuntu, и, следовательно, инструментов, связанных с Ubuntu. Я считаю, что этот ответ не обязательно должен быть уместным здесь.
— Сергей Колодяжный

Вам нужно будет запустить его через Wine, но, вероятно, можно запустить это на Ubuntu ... Это просто странный ответ, и все.
— Оли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.