Приложения GTK не представляют большой проблемы для KDE. Есть несколько специфичных для GTK вещей, которые KDE должен настроить для вас автоматически (темы и тому подобное), но по большей части нет реальной разницы между ванильными приложениями GTK и, скажем, приложениями Athena или TK. Библиотеки GTK и QT не мешают друг другу, и большинство проблем взаимодействия (буфер обмена и т. Д.) Были исправлены много лет назад.
Такие вещи, как (Libre | Open) Office и Firefox являются приложениями GTK. Готов поспорить, что Sublime тоже. Веб-сайт Remmina ужасен, но, видимо, на нем доступны версии только для GTK. Это будет то, что вы хотите использовать, и у вас не должно возникнуть проблем с KDE.
Проблема в том, что вы запускаете приложения GNOME. GNOME (а также KDE) предоставляет услуги, выходящие за рамки того, что делает инструментарий GTK. Чтобы запускать приложения GNOME и получить полную функциональность, вам понадобится работающая базовая среда GNOME, иначе вам не будет хватать функциональности. Это не проблема, если вы хотите поиграть в GMines, но вы заметите это, если попытаетесь запустить Nautilus.
По моему опыту, в конечном итоге происходит то, что подавляющее большинство того, что вы хотите делать, работает нормально, но иногда возникают странные проблемы, когда вы запускаете что-то специфичное для GNOME. Например, средство выбора файлов в приложении GNOME может не находить такие вещи, как ftp-сайты, которые вы создали. MySQL Workbench захочет использовать GNOME Keyring, который не взаимодействует с кошельком KDE (хотя есть способ заставить его работать). Однако практически все, что может вызвать серьезные проблемы, имеет аналог в KDE.
Расширение вашего подхода и использование расширения параметров:
export author_string='author1'
export new_string='author1'
find. -type f -name "*${author_string}*" \
-exec sh -c '
path="${1%/*}"
tmp="${1%%${author_string}[^/]*}"
before="${tmp##*/}"
after="${1##*${author_string}}"
echo mv -- "$1" "${path}/${new_string}_${before}${after}"' sh {} \;
Мои предположения, так как я не уверен, что полностью понял ваш вопрос:
Вы ищете файлы, имя которых содержит фиксированную строку; здесь переменная author_string
.
Вы переименовываете файлы везде в дереве каталогов.
Новое имя ваших файлов будет начинаться с фиксированной строки (она будет такой же, как author_string
или нет, не имеет большого значения ); здесь переменная new_string
.
Остальная часть нового имени ваших файлов будет равна их старому имени, за исключением части author_string
, которую вы хотите удалить.
В этом коде:
Мы экспортируем наши старые/новые строки, чтобы сделать их доступными для оболочки, вызванной find
.
Чтобы обеспечить мобильность, -exec
вызывает sh
. $1
используется вместо $0
, как в ваших фрагментах, потому что $0
обычно используется для установки имени оболочки/команды.
Для каждого файла мы разделяем его полный путь:
path="${1%/*}"
— полный путь с удаленной частью имени файла.:${parameter%word}
удаляет суффикс, соответствующий шаблону word
;
tmp="${1%%${author_string}[^/]*}"
захватывает часть полного пути каждого файла, которая предшествуетauthor_string
:${parameter%%word}
удаляет самый длинный суффикс , соответствующий шаблону word
. Мы используем [^/]
, чтобы игнорировать любое вхождение author_string
как части имен каталогов;
before="${tmp##*/}"
захватывает только ту подстроку, которая является частью имени файла.:${parameter##word}
удаляет самый длинный префикс, соответствующий шаблону word
;
after="${1##*${author_string}}"
— часть имени файла, следующая после author_string
;
Мы переименовываем каждый файл.
Обратите внимание, что если author_string
повторяется в имени файла, все промежуточные значения теряются.
Кроме того, имейте в виду, что вам нужно будет экранировать (с помощью\
)всех символов в author_string
, которые имеют особое значение сопоставления с образцом,если вы хотите, чтобы соответствовать им буквально.
Учитывая дерево каталогов:
$ tree.
.
├── testdir
│ ├── title2_author1_date.book
│ ├── title3_author1_date.book
│ └── title4_author2_date.book
├── title1_author1_date.book
└── title5_author2_date.book
Этот код делает:
$ export author_string='author1' new_string='author1'; find. -type f -name "*${author_string}*" -exec sh -c 'path="${1%/*}"; tmp="${1%%${author_string}[^/]*}"; before="${tmp##*/}"; after="${1##*${author_string}}"; echo mv -- "$1" "${path}/${new_string}_${before}${after}"' sh {} \;
mv --./title1_author1_date.book./author1_title1__date.book
mv --./testdir/title3_author1_date.book./testdir/author1_title3__date.book
mv --./testdir/title2_author1_date.book./testdir/author1_title2__date.book
Удалите echo
из команды, когда почувствуете, что готовы действительно переименовать файлы.
Ссылки:
Расширение параметра в «Основных спецификациях Open Group, выпуск 7, издание 2018 г.» (POSIX.1 -2017)
Похоже на работу Ларри Уолла rename
. Остерегайтесь, что есть другие команды с таким же названием, эта написана изнаночной.