У меня есть наборы сотен .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.
Править
Положение чисел всегда является тем же, как в примерах. Файлы имеют логику порядка, таким образом, процесс переименования должен быть полностью корректным.
Как я мог сделать то использование командной строки?
Хорошо, только для забавы, несомненно существуют более короткие 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]]
)
С помощью 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
Используя 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
$
Утилита переименования Perl - лучший вариант для этого, я думаю.
rename 's/(\w)0(\d)/$1$2/g' *.txt
Эта команда заменит все вхождения буквы, за которой следует ноль, за которым следует цифра, сохраняя букву и цифру при отбрасывании нуля, для каждого текстового файла в текущем каталоге.
на это можно использовать mmv, сначала установить
$ sudo apt-get install mmv
затем использование, это
mmv \*.txt \#1.text
переименовывает весь txt файл к текстовому файлу, я надеюсь, что это помогает Вам
Используя zsh:
autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'