Переименуйте несколько .txt файлов, изменяющих некоторые символы в определенных положениях

У меня есть наборы сотен .txt файлов в той же папке в Ubuntu 16.04, и их называют со строками и индексами, как этот:

a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
...
a20_s10_e02_skeleton.txt
...

Я должен удалить этот 0 (нули) из каждого .txt файла, где число меньше, чем 10, таким образом, в конце я буду иметь:

instead of : a01_s01_e01_skeleton.txt 

it will be: a1_s1_e1_skeleton.txt #notice that the 0s are gone. 

Править

Положение чисел всегда является тем же, как в примерах. Файлы имеют логику порядка, таким образом, процесс переименования должен быть полностью корректным.

Как я мог сделать то использование командной строки?

5
задан 30 August 2018 в 09:56

6 ответов

Хорошо, только для забавы, несомненно существуют более короткие cli решения, но в Python, сценарий ниже делает задание, если каталог является "плоским" (как Вы говорите), и все файлы в нем являются правильными файлами для переименования. В противном случае мы должны добавить исключение, таким образом, здесь мы идем:

import shutil
import sys
import os

dr = sys.argv[1]

for f in os.listdir(dr):
    sections = f.split("_")
    newname = "_".join(
        [s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
    )
    shutil.move(os.path.join(dr, f), os.path.join(dr, newname))

Использовать:

  • Скопируйте код в пустой файл, сохраните его как rename_stuff.py
  • Выполните его с каталогом как аргумент:

    python3 /path/to/rename_stuff.py </directory/with/files>
    

Как всегда, сначала примерьте демонстрационный каталог.

Объяснение

  • Считайте файлы в каталоге:

    for f in os.listdir(dr):
    
  • Разделите имя "_":

    sections = f.split("_")
    
  • На первых трех разделах замените два (или больше) разрядное число его интервалом - ("реальным") значением, таким образом, 01-> 1, 10-> 10, 020-> 20, 000300-> 300 и так далее.

  • Впоследствии, склейте разделы снова:

    newname = "_".join(
        [s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
    )
    
6
ответ дан 23 November 2019 в 08:38

С помощью perl rename вы можете удалить нули между нецифровой и цифрой.

$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ rename -n 's/(?<=\D)0+(?=\d)//g' *.txt
rename(a01_s01_e01_skeleton.txt, a1_s1_e1_skeleton.txt)
rename(a01_s01_e02_skeleton.txt, a1_s1_e2_skeleton.txt)
rename(a01_s01_e03_skeleton.txt, a1_s1_e3_skeleton.txt)
rename(a01_s02_e01_skeleton.txt, a1_s2_e1_skeleton.txt)
rename(a20_s10_e02_skeleton.txt, a20_s10_e2_skeleton.txt)

rename может быть или не быть версией Perl. В моей системе он называется file-rename и имеет альтернативную символическую ссылку как /usr/bin/rename

8
ответ дан 23 November 2019 в 08:38

Shellscript

Используя rename псевдоним rename.ul, установленный из пакета util-linux, я сделал следующий скрипт оболочки bash, который, я думаю, может сделать эту работу за вас.

#!/bin/bash

#####################


doer () {

# removes "0" from the string "{parameter}0"
# for example a0 --> a

 rename "s/${1}0/$1/" *
}
#####################

# main

#####################

doer a
doer s
doer e

Давайте вызовем сценарий оболочки renamer и дадим ему разрешения на выполнение.

Если удаляемым нулям предшествуют другие буквы, отличные от a, s, e, добавьте вызов doer с этими буквами в сценарий и измените сценарий оболочки, если есть экземпляры, не показанные в вашем примере файла имена, которые требуют более подробной информации в спецификации замены (функция doer).

Тест

Создание и проверка «оригинальных» файлов

$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ ls -1
a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
a20_s10_e02_skeleton.txt
renamer

Запуск сценария

$ ./renamer

Проверка результата

$ ls -1
a1_s1_e1_skeleton.txt
a1_s1_e2_skeleton.txt
a1_s1_e3_skeleton.txt
a1_s2_e1_skeleton.txt
a20_s10_e2_skeleton.txt
renamer
$ 
5
ответ дан 23 November 2019 в 08:38

Утилита переименования Perl - лучший вариант для этого, я думаю.

rename 's/(\w)0(\d)/$1$2/g' *.txt

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

2
ответ дан 23 November 2019 в 08:38

на это можно использовать mmv, сначала установить

 $ sudo apt-get install mmv

затем использование, это

 mmv \*.txt \#1.text

переименовывает весь txt файл к текстовому файлу, я надеюсь, что это помогает Вам

1
ответ дан 23 November 2019 в 08:38

Используя zsh:

autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'
1
ответ дан 23 November 2019 в 08:38

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

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