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

29

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

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

user236152
источник
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

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

terdon
источник
Можно ли улучшить это, чтобы заменить несколько отдельных символов (например, всех, которые не приемлемы для Windows) другими?
Сади
1
@ Сади см обновленный ответ.
Тердон
Всего их девять: "<>:" / \ | ? * "
Сади
@ Сади см обновленный ответ.
тердон
Спасибо, это может помочь создать скрипт Nautilus, который делает имена выбранных файлов совместимыми с Windows.
Сади
2

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

sudo apt-get install pyrenamer

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

pyrenamer

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

animaletdesequia
источник
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)

user154126
источник
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
TekWiz2010
источник
Это хорошо работает и имеет переменную подсказку ... Назовите файл как-то как _ Truncate Last Characters.cmd
TekWiz2010
3
Хотя это может быть правильным, в нем используется язык пакетных сценариев Windows. Мы на AskUbuntu, сайте для вопросов, связанных с Ubuntu, и, следовательно, инструментов, связанных с Ubuntu. Я считаю, что этот ответ не обязательно должен быть уместным здесь.
Сергей Колодяжный
Вам нужно будет запустить его через Wine, но, вероятно, можно запустить это на Ubuntu ... Это просто странный ответ, и все.
Оли