Как переключиться с CentOS 8 на CentOS Stream

Предполагая, что файлы изображений 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.

0
19.11.2019, 09:27
1 ответ

Не то чтобы я знаю. Сделайте резервную копию вашей системы и загрузите образ Stream по вашему выбору, чтобы установить его. Обязательно ознакомьтесь с примечаниями к выпуску .

-1
28.01.2020, 03:06

Теги

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