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

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

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

32
задан 16 January 2014 в 15:04

8 ответов

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

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

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

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

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

52
ответ дан 16 January 2014 в 15:04

Вот чистый бас:

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

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

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

$ 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

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


Для конкретных символов, которые вы просили, все немного сложнее, потому что некоторые из них должны быть escaped (я игнорирую /, так как *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

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

10
ответ дан 16 January 2014 в 15:04

Если вы предпочитаете GUI, установите pyrenamer:

sudo apt-get install pyrenamer

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

pyrenamer

В нём есть десятки опций для шаблонов и форматов переименования.

2
ответ дан 16 January 2014 в 15:04

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

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

(See www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful. html)

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

1
ответ дан 16 January 2014 в 15:04

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

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

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

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

0
ответ дан 16 January 2014 в 15:04

И вот Nautilus Script, который заменяет (все?) символы 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
ответ дан 16 January 2014 в 15:04

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

Install thunar:

sudo apt-get install thunar

Open thunar, search to your files, select them and select 'rename' (через контекстное меню или F2)

0
ответ дан 16 January 2014 в 15:04
@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
0
ответ дан 16 January 2014 в 15:04

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

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