Получите общий размер изображений jpeg на каталог в каждом каталоге, содержащем jpegs

FSF недавно отбросил GNU PDF из их списка приоритетных проектов, потому что библиотеки как poppler, podofo, MuPDF и Apache PDFBox разработали вполне приятно за прошлые годы. Учитывая скорость разработки GNU PDF за прошлые годы я испытываю желание назвать это ледниковым: у Них, кажется, проводят все их время в фундаментах зданий и до сих пор, кажется, нет, по крайней мере, минимального синтаксического анализатора. Кажется, что GNU Hurd будет закончен перед GNU PDF.

Посмотрите здесь для списка библиотек PDF.

2
18.03.2019, 05:04
2 ответа
for i in $(tree -dfi --noreport); do
    find $i -type f \( -iname "*.jpg" -or -iname "*.jpeg" \) -exec du {} \;
done

Отбросьте путь в конце find команда и -type опция должна появиться перед любыми другими опциями сделать поиск немного быстрее. Это должно сделать это.

Между прочим, для помощи Вам немного я сделал бы это таким образом:

for i in $( tree -dfi --noreport ); do 
    find $i -maxdepth 1 -type f \( -iname "*.jpg" -or -iname "*.jpeg" \) -exec du '{}' \; | awk -v d=$i '{ j+=$1; } END{ printf("%s: %d\n", d, j) }' | grep -Ev ": 0$"
done
2
27.01.2020, 22:01
  • 1
    Спасибо за это. Хотя это не делает то, что я надеялся. Также я думаю это Bork на именах dir, содержащих пробелы. Отказ в моем исходном подходе. –  batfastad 10.01.2013, 12:58

Ваша непосредственная ошибка состоит в том что дополнительна $i в конце find вызов — просто удаляет его. Порядок аргументов в пользу find является первым каталоги для пересечения, затем выражение для соответствия.

Я не понимаю назначение вызова к tree: find может сделать это. С GNU находят (т.е. на Linux или Cygwin), предполагая, что Ваши каталоги не содержат безумно многих .jpg файлы, -execdir основной на find позволяет Вам выполнить команду на всех файлах соответствия в каталоге.

find . \( -name '*.jpg' -o -name '*.jpeg' \) -execdir sh -c 'echo "$(du -c "$@" | sed -n "\$s/\\t.*//p") ${PWD#$0/}"' $PWD {} +

Обратите внимание, что версии GNU находят до 4.5.9, имеют ошибку, которая вызывает -execdir … {} + выполнять одну команду на файл, который бесполезен здесь. Таким образом, Вам, вероятно, придется работать усерднее.

Можно пересечь дерево каталогов в ударе. Установите globstar опция включить шаблон **/, который соответствует любому количеству уровней подкаталога, т.е. оно перечисляет подкаталоги рекурсивно. В каждом подкаталоге, если существуют файлы JPEG, вызов du вычислить их общий размер.

shopt -s globstar
for d in **/*/; do
  files=("$d/"*.jpg "$d/"*.jpeg)
  total=$(du -s -- "$files" 2>/dev/null | tail -n 1)
  total=${total%$'\t'*}
  echo "$total"$'\t'"$d"
done
2
27.01.2020, 22:01
  • 1
    Хороший..., что один лайнер работает красиво. Хорошая подсказка относительно -execdir также. Также, кажется, работает с именами dir, содержащими пробелы. Я только что начинаю с ударом, но я люблю, как существует столько способов сделать вещи как это. Я не мог найти способ сделать это в соответствии с Windows, таким образом, смонтировал, что SMB совместно использует и выполнил эту команду.Мило! –  batfastad 10.01.2013, 12:55
  • 2
    Также мне действительно было нужно -iname хотя, поскольку это пропускало некоторые каталоги, содержащие.JPG/.JPEG файлы –  batfastad 10.01.2013, 13:05
  • 3
    На самом деле я просто заметил одну вещь, тот же каталог часто появляется дважды с различными размерами, сообщил –  batfastad 10.01.2013, 15:06
  • 4
    @benbradley -execdir острота, к сожалению, только продолжает работать очень недавняя (и IIRC несколько более старых версий) GNU находят. Я думаю, что наиболее в настоящее время развертываемые системы имеют ошибочную версию, где это сообщает о каждом файле независимо. Попробуйте цикл удара (остерегайтесь этого, я не протестировал его). –  Gilles 'SO- stop being evil' 10.01.2013, 15:14

Теги

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