2016-04-02 93 views
3

背景Shell脚本找到JPG和MOV文件

iPhone有现场照片的,我想我可以使用VLC在Windows或一些iPhone应用程序采取所需画面的静态。长话短说,你可以但图像的质量以及分辨率大大降低。所以我放弃了这个。

问题

我沿着侧隐藏实际的电影文件的Live照片的

我的目标

使用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 ??

EDIT 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

'[[-f IMG_016.JPG && -f IMG_O16.MOV]]'只有在两个文件都存在的情况下才会返回true。追加'; echo文件对状态= $?'来查看视觉值。祝你好运。 – shellter

+0

@shellter感谢您的回复!我添加了我的move.sh文件。我试过你的上面的代码,但遗憾的是新的。我不确定如何使用它。我试过'ls | grep [[-f IMG_018.JPG && -f IMG_O18.MOV]]'哪个没有工作 – codeCompiler77

回答

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的值都应该是这两个扩展名。在最后一块我们检查条件并打印。假定文件名没有除扩展名之前的点分隔符。

您可以使用标准工具与过滤列表,例如管

... {print $1}' | xargs -I file mv file.{JPG,MOV} targetdirectory 

用真实姓名替换targetdirectory中。请注意,{print $1}是一个更好的选择。

UPDATE根据更新后的要求,文件名后面的字母后缀将被忽略,如果有三个文件实例需要过滤。这需要略有变化,第一至如前字母后缀(一个或多个)过滤器的文件名,并在结束打印文件列表只的量,计数为2

awk -F. '$2~/^(jpg|mov)$/{sub(/[a-z]+$/,"",$1); a[$1]++} 
         END{for(k in a) if(a[k]==2) print k}' 

和管mv

+0

这实际上是完美的,但你能解释它是如何工作的,尽管我很欣赏答案,我想学习和理解: )我也试着改变它,正如你所建议的'ls -1 | awk -F。 '$ 2〜/ ^(JPG | MOV)$/{a [$ 1] ++} a [$ 1]> 1 {print $ 1“.JPG”;打印$ 1“.MOV”}}“'但这不起作用,换行符并要求'>'额外的输入。 – codeCompiler77

+0

你有额外的'}' – karakfa

+0

谢谢你的解释!我认为a [$ 1]是迭代数组的值?这比我上面写的要简单得多= D最后一个问题,如果你不介意,是否可以添加到移动命令。那么将所有回来的文件移回到不同的文件夹? – codeCompiler77

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