求助一个关于批处理的问题。。。

OOo,TeX,KO,ABI,GIMP,Picasa,ProE,QCAD,Inkscape,Kicad,Eagle
回复
头像
chinaz
帖子: 238
注册时间: 2007-02-07 9:23

求助一个关于批处理的问题。。。

#1

帖子 chinaz » 2016-12-23 22:13

有一堆照片,有的是JPG,有的是jpg。按照不同日期分别存放于不同的文件夹里。
任务:提取图片元数据,每个文件夹里面的照片元数据都保存在这个文件夹中一个文件名为Exif.txt的文件里。

做过的尝试:
filelist=`ls *.JPG`
for name in $filelist;
do
echo 正在分析:$name;
identify -verbose $name >> Exif.txt
上面的脚本可以按照要求完成,但缺点一是一次只能处理一个文件夹中的照片数据,二是JPG与jpg不能一起处理。

还试了一个:
find ~/XXX -iname '*.JPG' -exec identify -verbose >> Exif.txt {} {} \;
上面的脚本可以一次处理所有照片,JPG和jpg都能一同处理,缺点是生成的所有照片的exif信息全部放在一个文件里面,并不能分别在每个文件夹里保存Exif文档。

请教高手,如何结合这两条脚本的优点:
一次处理所有照片,JPG和jpg都能一同处理,将照片的exif信息按照原有的文件夹结构,每个文件夹就生成关于这个文件夹里照片的Exif数据文件。
先谢谢~~~
宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。
头像
b33e
帖子: 3874
注册时间: 2011-06-07 14:20

Re: 求助一个关于批处理的问题。。。

#2

帖子 b33e » 2016-12-23 23:27

你的方法1稍微改一下就行啊
不区分大小写:

代码: 全选

filelist=`ls | grep -i '^.*jpg$'`
只能处理一个文件夹应该也不是什么问题,循环就行了
或者递归当前目录下包括子目录所有的.jpg或.JPG结尾的文件,结果为绝对路径

代码: 全选

filelist=`ls -R| sed "s:^:\`pwd\`/:" | grep -i '^.*jpg$'`
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 求助一个关于批处理的问题。。。

#3

帖子 cao627 » 2016-12-24 10:07

代码: 全选

/tmp$ a='/home/aaa/a.jpg'
/tmp$ echo ${a%/*}
/home/aaa
所以先得到带路径的文件名,用name变量取到这个值
然后
dentify -verbose $name >> ${name%/*}/Exif.txt
头像
chinaz
帖子: 238
注册时间: 2007-02-07 9:23

Re: 求助一个关于批处理的问题。。。

#4

帖子 chinaz » 2016-12-25 11:23

:em11 谢谢二位帮忙!晚上回去试试~
宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。
头像
sunfish
帖子: 989
注册时间: 2008-05-03 1:53

Re: 求助一个关于批处理的问题。。。

#5

帖子 sunfish » 2016-12-25 15:08

代码: 全选

filelist="$(find /xxx/ -name '*.[jJ][pP][gG]')"
for i in $filelist
do
    echo 正在分析:$i
    identify -verbose $i >> $(dirname $i)/Exif.txt
done
docker && kubernetes
头像
chinaz
帖子: 238
注册时间: 2007-02-07 9:23

Re: 求助一个关于批处理的问题。。。

#6

帖子 chinaz » 2017-01-01 21:14

2楼兄弟的方案还是只能处理当前文件夹下的任务,5楼的朋友给出的方案比较完美的解决了本人的需求。但是在测试中发现如果文件和文件夹的名字中带有空格,就会出错。。。
再次感谢各位的帮助!
宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。
头像
kashu
帖子: 451
注册时间: 2014-02-07 17:31
系统: Xubuntu 14.04.5 64位

Re: 求助一个关于批处理的问题。。。

#7

帖子 kashu » 2017-01-01 21:27

chinaz 写了:2楼兄弟的方案还是只能处理当前文件夹下的任务,5楼的朋友给出的方案比较完美的解决了本人的需求。但是在测试中发现如果文件和文件夹的名字中带有空格,就会出错。。。
再次感谢各位的帮助!
可参考一下我以前写的这个脚本(关键函数compress里),可递归切换到各个目录中依次执行相应的动作,支持特殊文件名(特殊字符)

代码: 全选

#!/bin/bash
#Author: kashu
#Date: 2016-01-30
#Filename: tinypng.sh
#Description: Advanced lossy compression for PNG/JPG images.

# Check if the curl command is executable
if [ ! -x "`which curl | head -1`" ]; then
	echo "Could not execute /usr/bin/curl"
	exit 1
fi

backup="/tmp/img_original_`date +%Y%m%d_%H%M%S`"
mkdir $backup &> /dev/null
if [ ! -d "$backup" ]; then
	exit
fi

compress(){
	find "$img_path" -maxdepth $max \( -iname "*.png" -o -iname "*.jpg" \) 2> /dev/null | while read file; do
		pic_url=$(curl -sif --user api:API_KEY --data-binary @"${file}" https://api.com/shrink|awk -F'"'  '/input/{print $(NF-1)}')
		if [ -z "$pic_url" ]; then
			continue
		fi
		suffix=${file##*.}
		suffix_lower=${pic_url##*.}
		mv --backup=t "${file}" $backup
		wget --no-check-certificate "$pic_url" -O "${file%.*}.${suffix_lower}"
	done
}

dir_err(){
	echo -e "$1"" is not a valid directory.\n"
}

help_info(){
	cat <<- END

	Options:
	-r|-R        Recursively compress images
	-h|--help    Print help info

	Usage:
	$0 [-r|-R] [/path/to/img]
	END
	exit
}

case "$1" in
	-h|--help)
		help_info ;;
	-r|-R)
		shift 1
		if [ -d "$1" ]; then
			img_path="$1"
			max=40
			compress
		elif [ -z "$1" ]; then
			img_path="$PWD"
			max=40
			compress
		else
			dir_err; help_info
		fi ;;
	*)
		if [ -d "$1" ]; then
			img_path="$1"
			max=1
			compress
		elif [ -z "$1" ]; then
			img_path="$PWD"
			max=1
			compress
		else
			dir_err; help_info
		fi ;;
esac


OS: Xubuntu 14.04.5 LTS 64-bit
CPU: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
RAM: 12GB DDR3 1333MHz
128GB SSD + 2TB HDD
神舟优雅A480B-I5B 购于 2012.08

YouTube频道:https://www.youtube.com/channel/UCGSPXZ ... DuDYX8L6Qg
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 求助一个关于批处理的问题。。。

#8

帖子 cao627 » 2017-01-01 22:30

但是在测试中发现如果文件和文件夹的名字中带有空格,就会出错

代码: 全选

find /your_path -iname '*.jpg' |xargs -i bash -c 'f="{}"; identify -verbose "$f"  >> "${f%/*}"/Exif.txt'
回复