У меня есть набор переименования необходимости файлов, но я не хочу создавать сценарий для него, просто командная строка.
Я должен удалить последние цифры между .
и .gif
:
22771786_01.204.gif
22771786_02.203.gif
22771786_03.10.gif
22771786_04.56.gif
Быть похожими на это:
22771786_01.gif
22771786_02.gif
22771786_03.gif
22771786_04.gif
Можно достигнуть этого с для цикла и некоторого расширения удара. Если Вы уже находитесь в каталоге, содержащем файлы:
for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done
Если Ваш каталог, содержащий файлы, называют/home/gifstore/:
for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done
${f...}
выполняет расширение каждого имени файла, которое мы сохранили в названную переменную f
. %
в расширении имени файла средства удаляют самое короткое соответствие следующего шаблона от конца переменной. Шаблон .*.gif
, значение любого количества символов между .
и .gif
. Наконец мы добавляем литеральную строку .gif
за пределами расширения, чтобы создать наше новое имя файла и полагаться mv
управляйте для перемещения файла.
Это не будет работать на скрытые файлы, начиная с .
.
rename
команда (можно также выполнить его как file-rename
) является подходящим к этой задаче. Существует несколько способов использовать его здесь. Я предлагаю это, хотя я покажу альтернативу ниже:
rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif
-n
опция делает его просто распечатать то, что переименовывает операции, было бы одно первое. После того как Вы довольны этим, выполните его снова без -n
сделать фактическое переименование. Одно из преимуществ rename
это, это не перезапишет файлы (если Вы не передадите его -f
опция, которую необходимо очень редко делать). Это особенно хорошо здесь, потому что Вы удаляете части из имен файлов, которые потенциально могли привести к именованию коллизий. Даже если коллизии не обнаруживаются при выполнении моделирования с -n
, они будут пойманы, когда Вы выполните фактическое переименование.
С этими четырьмя файлами Вы показали, что команда покажет этот вывод:
rename(22771786_01.204.gif, 22771786_01.gif)
rename(22771786_02.203.gif, 22771786_02.gif)
rename(22771786_03.10.gif, 22771786_03.gif)
rename(22771786_04.56.gif, 22771786_04.gif)
Конечно, Ваш вывод будет дольше, если у Вас будет больше чем четыре файла, которые я предполагаю, что Вы делаете.
Путь, которые управляют работами, является этим s/
выполняет замену. Имена файлов, которые содержат текст, который соответствует регулярному выражению ^\d{8}_\d\d\K\.\d+
изменяются так, чтобы соответствие было стерто, т.е. заменено пустой строкой, которая является между /
и /
в //
это следует за ним.
Хотя регулярное выражение могло быть записано таким способом как, чтобы гарантировать что только файлы, заканчивающиеся в .gif
на управляют, это является ненужным, потому что можно передать просто .gif
имена файлов к rename
. Оболочка расширяется *.gif
к списку тех файлов и передач тот список к rename
команда. Обратите внимание, что синтаксис использование оболочки для расширения имени файла не является тем же самым как регулярными выражениями. *
не имеет того же значения как в регулярных выражениях.
Вот что регулярное выражение ^\d{8}_\d\d\K\.\d+
делает:
^
привязки к началу строки.\d{8}
соответствует последовательности точно восьми цифр._
соответствует литералу _
. Это не является особенным.\d\d
соответствия еще две цифры.\K
забывает предыдущие подобранные символы. Это символы, которые мы хотим сохранить, в конце концов, не теми, мы хотим заменить. Эффект состоит в том, чтобы гарантировать, что те символы присутствуют незадолго до части мы на самом деле заменим.\.
соответствует литералу .
. Обратная косая черта необходима, потому что, когда точка появляется в регулярном выражении, она иначе соответствует любому отдельному символу.\d+
соответствия одна или несколько цифр.Таким образом это - a .
сопровождаемый цифрами, которые удалены. Если файл не начинается с необходимого шаблона, то там не идет ни в какое сравнение. Это помогает постараться не переименовывать файлы, которые Вы не хотите переименовывать.
Возможно записать более короткое rename
команда, которая должна работать. Я выбрал этот подход - среди многих возможных подходов - потому что команда выражает точно схему именования, на которую Вы хотите воздействовать. Это должно сказать, что решение напоминает проблему.
Если Вы хотите использовать более простое rename
команда, и Вы знаете весь .gif
файлы в текущем каталоге называют согласно Вашему описанию и нужно переименовать, можно использовать:
rename -n 's/\.\d+\.gif$/\.gif/' *
Помните это -n
просто шоу Вы, что будет сделано, и необходимо затем удалить его для фактического переименования файлов.
В той команде я включал .gif
суффикс в регулярном выражении, таким образом, Вы не должны фильтровать для него в именах файлов, которым Вы передаете rename
. Однако, Вы могли бы принять решение сделать так, если у Вас есть многие не -.gif
файлы в текущем каталоге, который был бы бессмысленно подобран *
.
Вот что регулярное выражение \.\d+\.gif$
делает:
\.
соответствует литералу .
. (Без \
, a .
соответствия любой символ.)\d+
соответствия одна или несколько цифр.\.
соответствия другой литерал .
.gif
соответствует буквенному тексту gif
.$
привязывает соответствие в конец имени файла.Так точка, заключительные цифры и суффикс .gif
подобраны, и все замененные просто .gif
.
Я лично люблю использовать рейнджера для подобных вещей. Это использует привязки клавиш Vim для навигации и такого, поэтому если Вы не знакомы с энергией, это могло бы стать запутывающим/трудным. Но если Вы уже знакомы с Vim, это должна быть простая задача!
Шаг 1
Установка ranger
. Можно установить его как плагин Vim или просто загрузить .tar.gz файл с веб-сайта.
Шаг 2
Выполненный Рейнджер и перешел к каталогу, который имеет файлы, которые Вы хотите переименовать. Я рекомендовал бы поместить весь .gifs в один каталог. Удостоверьтесь, что нет никаких других файлов кроме тех, Вы хотите переименовать.
Шаг 3
Пресса v
выбрать все файлы
Шаг 4
ввести :bulkrename
и нажмите Enter
Шаг 5
Используйте макрос Vim для записи изменений, которые Вы хотите внести. Таким образом для Вашего примера, если бы Вы запустили на самой первой строке файла, Вы использовали бы эти команды:
q a
(это запускает макрос, названный),
0
, f.
, de
(курсор перемещений для запуска строки, находит первое ".", затем удаляет к последнему знаку перед вторым "." прежде gif),
q
(чтобы прекратить записывать макрос)
Шаг 6
Переместитесь во вторую строку и переместите курсор в начало строки (j
,0
) и введите :2,$norm! @a
Это выполнит макрос, который Вы просто сделали (названный) от второй строки полностью до конца файла.
Шаг 7
:wq
сохранить и выйти и затем :wq
снова подтвердить изменения.
Таким образом, если все подходит, необходимо было переименовать все файлы. Если бы Вы не использовали Vim прежде, я рекомендовал бы использовать другой ответ, таким образом, Вы не должны изучать Vim только для переименования файлов. Я предпочитаю использовать Vim, таким образом, это - мой предпочтительный метод когда объемное переименование.
rename 's/\..*\./\./' *.gif
По сути, он говорит: «Замените все между символами .
и .
только одним .
»