Как удалить символы из имен файлов с помощью командной строки?

У меня есть набор переименования необходимости файлов, но я не хочу создавать сценарий для него, просто командная строка.

Я должен удалить последние цифры между . и .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
4
задан 14 November 2017 в 09:32

4 ответа

Можно достигнуть этого с для цикла и некоторого расширения удара. Если Вы уже находитесь в каталоге, содержащем файлы:

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 управляйте для перемещения файла.

Это не будет работать на скрытые файлы, начиная с ..

8
ответ дан 23 November 2019 в 11:44

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.

1
ответ дан 23 November 2019 в 11:44

Я лично люблю использовать рейнджера для подобных вещей. Это использует привязки клавиш 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, таким образом, это - мой предпочтительный метод когда объемное переименование.

1
ответ дан 23 November 2019 в 11:44
rename 's/\..*\./\./' *.gif

По сути, он говорит: «Замените все между символами . и . только одним . »

1
ответ дан 19 December 2019 в 12:07

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

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