背景
iPhone有现场照片,我想我可以在Windows或某些iPhone应用程序上使用VLC来拍摄所需的帧。长话短说,你可以,但图像的质量和分辨率大大降低。所以我放弃了这一点。
问题
我在Live Photo的旁边隐藏了实际的电影文件
我的目标
使用cygwin运行bash shell脚本迭代0000到9999,找到所有同名的JPG和MOV文件。
问题
我遇到了regex
我尝试了ls | grep -E "IMG_0016\.(JPG|MOV)"
我需要一个bash脚本,如果找到两个 jpg和给定文件名的mov文件,它将返回true。这可以在一个班轮中使用吗?谁能给我一些关于如何使上面的bash命令更健壮的想法?
它找到了两个,但我怎么说,好的,干得好,你有两个,现在用这两个文件做以下。
修改
for i in $(seq -f "%04g" 0 20)
do
FILENAME="IMG_$i"
#echo "$FILENAME"
var=$(ls -l | grep "$FILENAME" | grep -E "(JPG|MOV)" | wc -l)
if [ "$var" == 2 ] ; then
echo we found both for $FILENAME
echo $var
fi
done
输出
we found both for IMG_0018
2
we found both for IMG_0019
2
预期
目录中的文件是:
COMMENT
这是好的,因为它只查找2个文件,但必须有更好的方法来说找 ONE JPG和 ONE MOV ??
编辑2
#!/bin/bash
for i in $(seq -f "%04g" 0 20)
do
FILENAME="IMG_$i"
#echo "$FILENAME"
var=$(ls -l | grep "$FILENAME" | grep -E "(JPG|MOV)" | wc -l)
#echo $var
if [ "$var" == 2 ] ; then
#echo we found both for $FILENAME
var=$(ls -l | grep "$FILENAME" | grep -E JPG | wc -l)
if [ "$var" == 1 ] ; then
var=$(ls -l | grep "$FILENAME" | grep -E MOV | wc -l)
if [ "$var" == 1 ] ; then
mv "D:\Mike\Pictures\TEST\\$FILENAME.JPG" "D:\Mike\Pictures\TEST\MATCH\\$FILENAME.JPG"
mv "D:\Mike\Pictures\TEST\\$FILENAME.MOV" "D:\Mike\Pictures\TEST\MATCH\\$FILENAME.MOV"
fi
fi
fi
done
答案 0 :(得分:2)
awk
救援!
$ ls -1 | awk -F. '$2~/^(JPG|MOV)$/{a[$1]++} a[$1]>1{print $1}'
对于存在两个扩展名的情况,将打印不带后缀的文件名。如果要打印两个文件名,请将最后一个打印块更改为
{print $1".JPG"; print $1".MOV"}
ls -1
创建文件列表,每行一个文件。 awk -F.
告诉awk使用点作为字段分隔符,以便第二个字段是扩展名。我们检查第二个字段是否匹配任一选择。如果是这样,请增加使用文件名索引的数组。由于文件名是唯一的(直到扩展名),任何大于1的值都应该是这两个扩展名。在最后一个块中,我们检查该条件并打印。假设文件名没有除扩展名之外的点分隔符。
您可以将标准工具与过滤列表一起使用,例如pipe to
... {print $1}' | xargs -I file mv file.{JPG,MOV} targetdirectory
用实名替换targetdirectory。请注意,{print $1}
是更好的选择。
更新根据更新的要求,将忽略文件名的字母后缀,如果有三个文件实例,则也需要对其进行过滤。这需要稍作更改,首先将字母后缀(一个或多个)过滤到文件名,然后仅在计数为2的末尾打印文件列表。
awk -F. '$2~/^(jpg|mov)$/{sub(/[a-z]+$/,"",$1); a[$1]++}
END{for(k in a) if(a[k]==2) print k}'
并像以前一样管道到mv
答案 1 :(得分:1)
for movfile in IMG_[0-9][0-9][0-9][0-9].MOV ; do
base=${movfile%.MOV}
jpgfile=$base.JPG
if [[ -e $jpgfile ]] ; then
echo "we found both for $base"
fi
done