SQLite не поддерживает это расширение для стандартного SQL - вам нужно использовать оба оператора, сначала SELECT, DELETE next. Конечно, вы можете обернуть их в транзакции (инструкции BEGIN и COMMIT до и после этого гарантируют), чтобы гарантировать атомарность и согласованность.
Я придумал этого:
find -maxdepth 1 -type d | while read dir; do
count=$(find "$dir" -maxdepth 1 -iname \*.jpg | wc -l)
echo "$dir ; $count"
done
Отбрасывание второе -maxdepth 1
, если поиск в рамках каталогов для jpg файлов должен быть рекурсивными подкаталогами рассмотрения. Обратите внимание, что это только рассматривает название файлов. Вы могли переименовать файл, скрывая это это - jpg изображение. Можно использовать эти file
команда, чтобы сделать предположение на содержании, вместо этого (теперь, также поиски рекурсивно):
find -mindepth 1 -maxdepth 1 -type d | while read dir; do
count=$(find "$dir" -type f | xargs file -b --mime-type |
grep 'image/jpeg' | wc -l)
echo "$dir ; $count"
done
Однако, который намного медленнее, так как это должно считать часть файлов и в конечном счете интерпретировать то, что они содержат (если это удачно, это находит волшебный идентификатор в начале файла). Эти -mindepth 1
препятствует тому, чтобы он печатал .
(текущий каталог) как другой каталог, который это ищет.
мой быстрее для ввода из командной строки.:)
другие предложения предлагают какое-либо реальное преимущество перед следующим?
find -name '*.jpg' | wc -l # recursive
find -maxdepth 1 -name '*.jpg' | wc -l # current directory only
#!/bin/bash
for dir in `find . -type d | grep -v "\.$"`; do
echo $dir
ls $dir/*.jpg | wc -l
done;
Можно сделать это без внешних команд:
for d in */; do
set -- "$d"*.jpg
printf "%s: %d\n" "${d%/}" "$#"
done
Или можно использовать awk ( nawk или /usr/xpg4/bin/awk на Солярис ):
printf "%s\n" */*jpg |
awk -F\/ 'END {
for (d in _)
print d ":",_[d]
}
{ _[$1]++ }'