用于查找JPG和MOV文件的Shell脚本

时间:2016-04-02 21:50:52

标签: bash shell awk cygwin

背景

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

预期

目录中的

文件是:

  • IMG_0016.JPG
  • IMG_0018.JPG
  • IMG_0018.MOV
  • IMG_0019.JPG
  • IMG_0019.MOV

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

2 个答案:

答案 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