Пакетный поиск и замена имени файла в файле с помощью цикла - PullRequest
1 голос
/ 07 августа 2020

У меня windows (но со временем я могу запустить виртуальный linux), и я пытаюсь заменить некоторые строки в нескольких python файлах Ren'Py, когда я вызываю свой image или musi c файлы в них

Я имею в виду, что на самом деле в моих файлах Ren'Py у меня есть: imagebutton "aaaa.png" и я хотел бы заменить его на imagebutton "images/aaaa.png" И я хотел бы это сделать со всеми файлами в другой папке, так как я теперь переместил все свои 7500 изображений в папку / images /

На самом деле мои папки такие:

script1.rpy
script2.rpy
/images/aaaa.png
/images/bbbb.png

Я обнаружил, что:

find -name '*.png' -printf '%f\n' |
while read file; do
    # do something with "$file"
done 

while read a; do
    echo ${a//abc/XYZ}
done < /tmp/file.txt > /tmp/file.txt.t
mv /tmp/file.txt{.t,}

А вот как совместить уж не знаю: (

Ответы [ 2 ]

1 голос
/ 09 августа 2020

Если вы хотите заменить imagebutton «aaaa.png» на imagebutton «images / aaaa.png», это выглядит следующим образом:

while read a; do
  echo ${a//imagebutton \"/imagebutton \"images\/}
done < /tmp/file.txt

Другой способ, есть способ использовать ассоциативные массивы в Bash. Однако я не подтвердил, работает ли он со многими файлами.

declare -A files
for file in `find -name '*.png'`; do
    name=`basename $file`;
    files[$name]=${file#./};
done
while read a; do
  from=`echo $a | grep -o -E "[^\"]+\.png"`
  echo ${a//$from/${files[$from]}}
done < /tmp/file.txt

Я думаю, что лучше писать в Python, если вы можете использовать Python.

0 голосов
/ 10 августа 2020

Да, решил сделать в Python

import os
import sys

from os import listdir
from os.path import isfile, join

scripts = [s for s in listdir(sys.argv[1]) if isfile(join(sys.argv[1], s)) and "rpy" == s.split(".")[1]]
folders = ["images", "sounds"]
warning = []

for script in scripts:
    print(script)
    file = open(script, "r", encoding="utf8")
    content = file.readlines()
    file.close()
    for folder in folders:
        folderContent = [i for i in listdir(sys.argv[1] + os.sep + folder) if isfile(join(sys.argv[1] + os.sep + folder, i))]

        for fc in folderContent:
            for i, e in enumerate(content):
                if fc in e:
                    if len(e.split("/")) > 1:
                        warning.append(script + " | ligne " +  str(i+1))

                    content[i] = content[i].replace(fc, folder + "/" + fc)

    file = open(script, "w", encoding="utf8")
    file.write("".join(content))
    file.close()

file = open("warningRename.txt", "w", encoding="utf8")
file.write("\n".join(warning))
file.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...