Similization
@Similization
В прострации

Как пройтись по указанным директориям (по некоторым рекурсивно, по некоторым нет) и для файлов с определенным расширением произвести редактирование?

Накопилось много кода на питоне, но стиль в нем отличается, в частности кавычки
Я хочу заменить все одинарные кавычки на двойные, кроме апострофов.
У меня есть 3 директории, по которым я хотел бы пройтись:
discord_bot
---modules
---scripts
Найти файлы с определенным разрешением и вызвать скрипт.
По основной директории нужно пройтись без захода во вложенные директории(не реккурентно), остальные же надо пройти целиком.
Я тут полазил по форумам, собрал вроде как нужные куски, но в bash совершенно не разбираюсь, чтобы из этих кусков получилось что-то стоящее:
#!/bin/bash
# массив относительных путей
directories_to_check=(scripts modules)

# нужно найти полный путь до discord_bot
# после чего пройтись по всем папкам и файлам,
# если файл с нужным расширением - вызываем функцию замены
# если папка(директория) - нужно проверить, что это та директория,
# которая нам нужна, после чего пройтись по ней реккурентно

for elements in path_to_discord_bot
do
  if file_extension_is_json_or_py
    do_script
  elif directory in needed_directories
    #  опять же интересуют только файлы с расширением .py и .json
    go_through_with_reccurency
done

# находит все абсолютные пути
abspath () { case "$1" in /*)printf "%s\n" "$1";; *)printf "%s\n" "$PWD/$1";; esac; }

# выводит все внутренние папки и файлы
find . -print0 | while IFS= read -r -d '' file
do
    echo "$file"
done

# замена одиночных кавычек на двойные
sed -E "s/'([^']*)'/\"\1\"/g"
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Для приведения кода к единому стилю, проще воспользоваться форматтерами типа flake8, black. Лучше гуглить в этом направлении. Там уже все за вас написано.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
find /home/bitrix/ext_www/shop.wildorchid.ru/{upload/resize_cache,upload/iblock/,local}/ -type f -regex ".*\(jpg\|jpeg\|JPG\|JPEG\)" -exec jpegoptim --preserve --preserve-perms --max=85 {} \;

home/bitrix/ext_www/shop.wildorchid.ru/{upload/resize_cache,upload/iblock/,local}/
поиск по конкретным директориям рекурсивно.
-type f- только файлы
-regex ".*\(jpg\|jpeg\|JPG\|JPEG\)" - ну думаю тут и так понятно (более расширенный синтаксис)
-exec - встроенная функция файнд, выполнить с найденым массивом, по факту это цикл с выводом массива
поиска.
jpegoptim --preserve --preserve-perms --max=85 {} \;
Собственно массив файлов передается в exec тот в свою очередь запускет jpegoptim с параметрами, где {} собственно сам массив файлов.

В результате этого скрипта на этих файлах будет применена оптимизация
в вашем случае просто переименуйте или что там вам нужно.
Отдельно обращу внимание что по факту на exec поступает каждая строка по отдельности а не кучей аргументов.
То есть если будет найдено 10 файлов то 10 раз выполнится экзек, а не 1 с 10 аргументами.
если вам нужно последнее то это через xargs
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы