Рекурсивно перечислить все каталоги, содержащие один или несколько файлов изображений jpg.

Это невозможно в том смысле, что вы можете предоставить аргументы для rpm, например при установке ваших пользовательских пакетов, чтобы переопределить значения, содержащиеся в пакете. Но вы можете добавить логику в сценарии оболочки, которые запускаются во время установки rpm, и, следовательно, можете делать свои настройки таким образом.

Fedora по умолчанию добавляет / удаляет пользователей с помощью некоторых скриптлетов, подробности см. В вики Fedora: https://fedoraproject.org/wiki/Packaging:UsersAndGroups и некоторую общую информацию о% post /% и все варианты см. объяснение в книге Max RPM по адресу http://www.rpm.org/max-rpm/s1-rpm-inside-scripts.html (раздел «Сценарии установки / стирания») и для заказа, возможно, https://fedoraproject.org/wiki/Packaging:Scriptlets . Для получения более подробной информации см. http://wiki.networksecuritytoolkit.org/nstwiki/index.php/RPM_Quick_Reference

Итак, для вашего конкретного вопроса вы можете попробовать прочитать переменные для имени пользователя, имени группы, поле gecos или что-то еще (значения, которые должны быть настроены в целевой системе) из некоторого стандартного места, например / etc / sysconfig / custom_defaults или что-то в этом роде. Таким образом, это настраивается каждым клиентом, но вы должны выполнить некоторые проверки корректности переменных и предоставить значения по умолчанию, если пользовательские значения по умолчанию не установлены, но это то же самое для всех сценариев оболочки в целом.

2
10.09.2017, 23:12
2 ответа

Предполагая, что файлы изображений JPEG имеют суффикс.jpg:

find "$HOME" -type f -name '*.jpg' \
    -exec sh -c 'for d; do dirname "$d"; done' sh {} + | sort -u -o jpeg_dirs.txt

Это зависит от того, что у вас нет броских имен каталогов с символами новой строки в именах.

С помощью GNUfind:

find "$HOME" -type f -name '*.jpg' -printf '%h\n' | sort -u -o jpeg_dirs.txt

Эти findкоманды найдут все изображения JPEG в вашем домашнем каталоге и напечатают имена каталогов, в которых они были найдены. sort -uвозьмет этот список имен каталогов, отсортирует его и удалит дубликаты. Результат будет записан в файл jpeg_dirs.txtв текущем каталоге.


Оглядываясь назад на это в начале 2021 года (3,3 года спустя )я немного съеживаюсь, потому что мое решение, приведенное выше, хотя и не является неверным само по себе, немного назад. Это также делает очевидное предположение о «хороших именах файлов» (без новых строк ).

Когда вы используете findдля поиска каталогов, не ищите обычные файлы, как я сделал выше; на самом деле искать каталоги. Когда у нас есть каталоги, мы можем заглянуть в каждый из них и посмотреть, соответствует ли файл *.jpgили*.JPG(дополнительные суффиксы имени файла, которые легко добавить):

find "$HOME" -type d -exec bash -O nullglob -O dotglob -O extglob -c '
    for dirpath do
        set -- "$dirpath"/*.@(jpg|JPG)
        [[ "$#" -gt 0 ]] && printf "%s\n" "$dirpath"
    done' bash {} +

Это заглядывает в каждый каталог из вашего домашнего каталога и пытается расширить шаблон подстановки *.@(jpg|JPG)в каждом. Этот шаблон, который также можно было бы записать как два отдельных шаблона, *.jpgи *.JPG, соответствует всем файлам, которые мы ищем. Если одно имя совпадает, мы предполагаем, что это каталог, имя которого мы хотим вывести.Это даст ложные срабатывания для каталогов, которые содержат только подкаталоги с этими суффиксами.

Параметры оболочки, с которыми мы запускаем наш внутренний bashскрипт, позволяют нам сопоставлять скрытые имена (dotglob), позволяют полностью исчезнуть шаблону подстановки, если он не соответствует чему-либо, вместо того, чтобы оставаться нераскрытым (nullglob), и позволяют мы используем вдохновленныйksh-расширенный шаблон подстановки @(...|...).

Использование оболочки zsh:

typeset -U list=(~/**/*.(jpg|JPG)(.DN:h))
print -rC1 $list

Это создает переменную массива, list, которая имеет свойство хранить только уникальные элементы. Он инициализируется в результате расширения шаблона подстановки имени файла. Шаблон соответствует всем файлам изображений JPEG в или ниже домашнего каталога, а :hв конце удаляет фактическое имя файла из сгенерированных путей. .заставляет шаблон соответствовать только обычным файлам, а Dи Nдействуют как dotglobи nullglobв bash.

7
27.01.2020, 21:53
find. -iname '*.jpg' -execdir sh -c 'pwd' _ {} + | sort -u > dirs_with_jpegs.txt

Должно работать достаточно хорошо, если предположить, что ваша реализация findподдерживает-execdir(скорее всего ). -execdirвыполняет команду в каталоге, где находится найденный файл. В этом случае мы выполняем команду pwd, которая печатает имя каталога. Мы заключаем команду в sh -c, чтобы убрать аргументы. (Некоторые (все? )реализации findтребуют подстановки аргумента {}, который будет списком файлов jpeg в текущем каталоге. Мы хотим игнорировать этот список и печатать только каталог.)

0
27.01.2020, 21:53

Теги

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