Извлечение данных из CSV-файла, где некоторые поля имеют запятую в значении поля

Приложения 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.

0
20.02.2019, 00:21
2 ответа

Расширение вашего подхода и использование расширения параметров:

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)

0
28.01.2020, 03:59

Похоже на работу Ларри Уолла rename. Остерегайтесь, что есть другие команды с таким же названием, эта написана изнаночной.

0
28.01.2020, 03:59

Теги

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