Предполагая, что файлы изображений 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
.
Не то чтобы я знаю. Сделайте резервную копию вашей системы и загрузите образ Stream по вашему выбору, чтобы установить его. Обязательно ознакомьтесь с примечаниями к выпуску .