2016-04-02 106 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